Skip to content

Commit

Permalink
Fix buffer overflow if output iterator is std::back_insert_iterator a…
Browse files Browse the repository at this point in the history
…nd value is escaped (debug format)

Signed-off-by: Vladislav Shchapov <[email protected]>
  • Loading branch information
phprus authored and vitaut committed Jan 10, 2024
1 parent 401f087 commit 961df82
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
5 changes: 4 additions & 1 deletion include/fmt/format.h
Original file line number Diff line number Diff line change
Expand Up @@ -2388,9 +2388,12 @@ FMT_CONSTEXPR auto write(OutputIt out, basic_string_view<Char> s,
size = code_point_index(s, to_unsigned(specs.precision));
bool is_debug = specs.type == presentation_type::debug;
size_t width = 0;

if (is_debug) size = write_escaped_string(counting_iterator{}, s).count();

if (specs.width != 0) {
if (is_debug)
width = write_escaped_string(counting_iterator{}, s).count();
width = size;
else
width = compute_width(basic_string_view<Char>(data, size));
}
Expand Down
12 changes: 11 additions & 1 deletion test/compile-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,16 @@ TEST(compile_test, format_default) {
# endif
}

TEST(compile_test, format_escape) {
EXPECT_EQ("\"string\"", fmt::format(FMT_COMPILE("{:?}"), "string"));
EXPECT_EQ("prefix \"string\"",
fmt::format(FMT_COMPILE("prefix {:?}"), "string"));
EXPECT_EQ("\"string\" suffix",
fmt::format(FMT_COMPILE("{:?} suffix"), "string"));
EXPECT_EQ("\"abc\"", fmt::format(FMT_COMPILE("{0:<5?}"), "abc"));
EXPECT_EQ("\"abc\" ", fmt::format(FMT_COMPILE("{0:<7?}"), "abc"));
}

TEST(compile_test, format_wide_string) {
EXPECT_EQ(L"42", fmt::format(FMT_COMPILE(L"{}"), 42));
}
Expand Down Expand Up @@ -288,7 +298,7 @@ TEST(compile_test, compile_format_string_literal) {
// line 8635)
#if (FMT_CPLUSPLUS >= 202002L || \
(FMT_CPLUSPLUS >= 201709L && FMT_GCC_VERSION >= 1002)) && \
((!FMT_GLIBCXX_RELEASE || FMT_GLIBCXX_RELEASE >= 10) && \
((!FMT_GLIBCXX_RELEASE || FMT_GLIBCXX_RELEASE >= 10) && \
(!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION >= 10000) && \
(!FMT_MSC_VERSION || \
(FMT_MSC_VERSION >= 1928 && FMT_MSC_VERSION < 1930))) && \
Expand Down

0 comments on commit 961df82

Please sign in to comment.