Don't truncate output size to int in fmt_vformat and vfprintf

This commit is contained in:
Aizal Khan 2026-10-16 23:37:26 +05:30
parent fdf31252e6
commit 5564ba3f45
2 changed files with 4 additions and 1 deletions

View File

@ -627,7 +627,8 @@ auto vfprintf(std::FILE* f, basic_string_view<Char> fmt,
auto buf = basic_memory_buffer<Char>();
detail::vprintf(buf, fmt, args);
size_t size = buf.size();
return std::fwrite(buf.data(), sizeof(Char), size, f) < size
return std::fwrite(buf.data(), sizeof(Char), size, f) < size ||
size > detail::to_unsigned(detail::max_value<int>())
? -1
: static_cast<int>(size);
}

View File

@ -8,6 +8,7 @@
#include "fmt/fmt-c.h"
#include <fmt/core.h>
#include <limits.h> // INT_MAX
constexpr size_t max_c_format_args = 16;
@ -45,6 +46,7 @@ extern "C" int fmt_vformat(char* buffer, size_t size, const char* fmt,
auto result = fmt::vformat_to_n(
buffer, size, fmt,
fmt::format_args(format_args, static_cast<int>(num_args)));
if (result.size > INT_MAX) return fmt_error;
return static_cast<int>(result.size);
}
FMT_CATCH(...) {}