From 33a82976931bd3ec1b1fe807e087f42bc4546ace Mon Sep 17 00:00:00 2001 From: MadMax Date: Mon, 3 Aug 2026 01:49:12 +0100 Subject: [PATCH 1/2] fix: support restricted Windows code pages --- src/shared/Auth/OpenSSLProvider.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/shared/Auth/OpenSSLProvider.cpp b/src/shared/Auth/OpenSSLProvider.cpp index 90db11701..43c9243ae 100644 --- a/src/shared/Auth/OpenSSLProvider.cpp +++ b/src/shared/Auth/OpenSSLProvider.cpp @@ -161,19 +161,26 @@ bool ConvertWideToAnsi(const std::wstring& value, std::string& converted) if (value.empty()) return false; + constexpr UINT GB18030_CODE_PAGE = 54936; + UINT const codePage = GetACP(); + bool const restrictedCodePage = + codePage == CP_UTF8 || codePage == GB18030_CODE_PAGE; + DWORD const flags = restrictedCodePage ? + WC_ERR_INVALID_CHARS : WC_NO_BEST_FIT_CHARS; BOOL usedDefault = FALSE; + BOOL* usedDefaultPointer = restrictedCodePage ? nullptr : &usedDefault; int required = WideCharToMultiByte( - CP_ACP, WC_NO_BEST_FIT_CHARS, value.c_str(), -1, - nullptr, 0, nullptr, &usedDefault); - if (required <= 0 || usedDefault) + codePage, flags, value.c_str(), -1, + nullptr, 0, nullptr, usedDefaultPointer); + if (required <= 0 || (!restrictedCodePage && usedDefault)) return false; std::vector buffer(static_cast(required)); usedDefault = FALSE; int written = WideCharToMultiByte( - CP_ACP, WC_NO_BEST_FIT_CHARS, value.c_str(), -1, - buffer.data(), required, nullptr, &usedDefault); - if (written <= 0 || usedDefault) + codePage, flags, value.c_str(), -1, + buffer.data(), required, nullptr, usedDefaultPointer); + if (written <= 0 || (!restrictedCodePage && usedDefault)) return false; converted.assign(buffer.data(), static_cast(written - 1)); From f5c402a1b9261b3e8207249c11c22730461f9a43 Mon Sep 17 00:00:00 2001 From: MadMax Date: Mon, 3 Aug 2026 01:52:50 +0100 Subject: [PATCH 2/2] refactor: simplify OpenSSL conversion checks --- src/shared/Auth/OpenSSLProvider.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/Auth/OpenSSLProvider.cpp b/src/shared/Auth/OpenSSLProvider.cpp index 43c9243ae..babe88fda 100644 --- a/src/shared/Auth/OpenSSLProvider.cpp +++ b/src/shared/Auth/OpenSSLProvider.cpp @@ -172,7 +172,7 @@ bool ConvertWideToAnsi(const std::wstring& value, std::string& converted) int required = WideCharToMultiByte( codePage, flags, value.c_str(), -1, nullptr, 0, nullptr, usedDefaultPointer); - if (required <= 0 || (!restrictedCodePage && usedDefault)) + if (required <= 0 || usedDefault) return false; std::vector buffer(static_cast(required)); @@ -180,7 +180,7 @@ bool ConvertWideToAnsi(const std::wstring& value, std::string& converted) int written = WideCharToMultiByte( codePage, flags, value.c_str(), -1, buffer.data(), required, nullptr, usedDefaultPointer); - if (written <= 0 || (!restrictedCodePage && usedDefault)) + if (written <= 0 || usedDefault) return false; converted.assign(buffer.data(), static_cast(written - 1));