diff --git a/format.cc b/format.cc index b70095b7..6c0905b0 100644 --- a/format.cc +++ b/format.cc @@ -612,14 +612,17 @@ FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { #if FMT_USE_WINDOWS_H FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { - int length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s.size(), 0, 0); static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; + if (s.size() > INT_MAX) + FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); + int s_size = static_cast(s.size()); + int length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); if (length == 0) FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); buffer_.resize(length + 1); length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s.size(), &buffer_[0], length); + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); if (length == 0) FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); buffer_[length] = 0; diff --git a/test/util-test.cc b/test/util-test.cc index a3b17330..b92171ab 100644 --- a/test/util-test.cc +++ b/test/util-test.cc @@ -726,12 +726,14 @@ TEST(UtilTest, UTF8ToUTF16) { } template -void check_utf_conversion_error(const char *message) { +void check_utf_conversion_error( + const char *message, + fmt::BasicStringRef str = fmt::BasicStringRef(0, 0)) { fmt::MemoryWriter out; fmt::internal::format_windows_error(out, ERROR_INVALID_PARAMETER, message); fmt::SystemError error(0, ""); try { - Converter(fmt::BasicStringRef(0, 0)); + (Converter)(str); } catch (const fmt::SystemError &e) { error = e; } @@ -745,14 +747,17 @@ TEST(UtilTest, UTF16ToUTF8Error) { } TEST(UtilTest, UTF8ToUTF16Error) { + const char *message = "cannot convert string from UTF-8 to UTF-16"; + check_utf_conversion_error(message); check_utf_conversion_error( - "cannot convert string from UTF-8 to UTF-16"); + message, fmt::StringRef("foo", INT_MAX + 1u)); } TEST(UtilTest, UTF16ToUTF8Convert) { fmt::internal::UTF16ToUTF8 u; EXPECT_EQ(ERROR_INVALID_PARAMETER, u.convert(fmt::WStringRef(0, 0))); - EXPECT_EQ(ERROR_INVALID_PARAMETER, u.convert(fmt::WStringRef(L"foo", INT_MAX + 1u))); + EXPECT_EQ(ERROR_INVALID_PARAMETER, + u.convert(fmt::WStringRef(L"foo", INT_MAX + 1u))); } #endif // _WIN32