Bug 1717448 - Patch {fmt} to avoid crashing when printing nullptr strings, and attempting to print to an invalid FILE*. r=nika

This brings `{fmt}` closer to our printf.

Differential Revision: https://phabricator.services.mozilla.com/D217722
This commit is contained in:
Paul Adenot
2024-10-21 12:54:53 +00:00
parent f646306442
commit 6fcece10f4
3 changed files with 46 additions and 3 deletions

View File

@@ -2299,7 +2299,7 @@ FMT_CONSTEXPR auto write(OutputIt out, const Char* s, const format_specs& specs,
locale_ref) -> OutputIt {
if (specs.type() == presentation_type::pointer)
return write_ptr<Char>(out, bit_cast<uintptr_t>(s), &specs);
if (!s) report_error("string pointer is null");
if (!s) return write_bytes<Char>(out, "(null)", specs);
return write<Char>(out, basic_string_view<Char>(s), specs, {});
}
@@ -3578,8 +3578,7 @@ FMT_CONSTEXPR auto write(OutputIt out, Char value) -> OutputIt {
template <typename Char, typename OutputIt>
FMT_CONSTEXPR20 auto write(OutputIt out, const Char* value) -> OutputIt {
if (value) return write(out, basic_string_view<Char>(value));
report_error("string pointer is null");
return out;
return write_bytes<Char>(out, "(null)");
}
template <typename Char, typename OutputIt, typename T,

View File

@@ -19,6 +19,8 @@ vendoring:
url: https://github.com/fmtlib/fmt
source-hosting: github
tracking: commit
patches:
- print-null-string.patch
exclude:
- test

42
third_party/fmt/print-null-string.patch vendored Normal file
View File

@@ -0,0 +1,42 @@
diff --git a/include/fmt/format.h b/include/fmt/format.h
--- a/include/fmt/format.h
+++ b/include/fmt/format.h
@@ -2294,17 +2294,17 @@ FMT_CONSTEXPR auto write(OutputIt out, b
const format_specs& specs, locale_ref) -> OutputIt {
return write<Char>(out, s, specs);
}
template <typename Char, typename OutputIt>
FMT_CONSTEXPR auto write(OutputIt out, const Char* s, const format_specs& specs,
locale_ref) -> OutputIt {
if (specs.type() == presentation_type::pointer)
return write_ptr<Char>(out, bit_cast<uintptr_t>(s), &specs);
- if (!s) report_error("string pointer is null");
+ if (!s) return write_bytes<Char>(out, "(null)", specs);
return write<Char>(out, basic_string_view<Char>(s), specs, {});
}
template <typename Char, typename OutputIt, typename T,
FMT_ENABLE_IF(is_integral<T>::value &&
!std::is_same<T, bool>::value &&
!std::is_same<T, Char>::value)>
FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt {
@@ -3573,18 +3573,17 @@ FMT_CONSTEXPR auto write(OutputIt out, C
auto it = reserve(out, 1);
*it++ = value;
return base_iterator(out, it);
}
template <typename Char, typename OutputIt>
FMT_CONSTEXPR20 auto write(OutputIt out, const Char* value) -> OutputIt {
if (value) return write(out, basic_string_view<Char>(value));
- report_error("string pointer is null");
- return out;
+ return write_bytes<Char>(out, "(null)");
}
template <typename Char, typename OutputIt, typename T,
FMT_ENABLE_IF(std::is_same<T, void>::value)>
auto write(OutputIt out, const T* value, const format_specs& specs = {},
locale_ref = {}) -> OutputIt {
return write_ptr<Char>(out, bit_cast<uintptr_t>(value), &specs);
}