diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index f6fa29abd011..ba0abc98223f 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -19,6 +19,7 @@ #include #include // for std::ptrdiff_t #include // for std::memmove +#include #if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) # include #endif @@ -968,6 +969,10 @@ FMT_FUNC void report_windows_error(int error_code, #endif FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { + if (std::fwide(f, -1) >= 0) { + FMT_THROW(system_error(EILSEQ, + "cannot write byte data into wide-oriented stream")); + } memory_buffer buffer; internal::vformat_to(buffer, format_str, basic_format_args>(args)); @@ -975,9 +980,16 @@ FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { } FMT_FUNC void vprint(std::FILE* f, wstring_view format_str, wformat_args args) { + if (std::fwide(f, 1) <= 0) { + FMT_THROW(system_error(EILSEQ, + "cannot write wide data into byte-oriented stream")); + } wmemory_buffer buffer; internal::vformat_to(buffer, format_str, args); - internal::fwrite_fully(buffer.data(), sizeof(wchar_t), buffer.size(), f); + buffer.push_back(L'\0'); + if (std::fputws(buffer.data(), f) == -1) { + FMT_THROW(system_error(errno, "cannot write to file")); + } } FMT_FUNC void vprint(string_view format_str, format_args args) {