From 1ae0a838807509fabf4a6af98040a692e39ea718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 27 May 2023 22:28:40 +0800 Subject: [PATCH] Windows: fix potential memory curruption bug in unicode.c Also add ffStrbufInitWS --- CHANGELOG.md | 1 + src/util/windows/unicode.c | 21 +++++++++------------ src/util/windows/unicode.h | 14 +++++++++++++- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c0264a56..52a923d63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Bugfixes: * Fix iTerm being detected as iTermServer-* sometimes * Fix sound device volume being incorrectly detected as muted sometimes (Sound) * Fix memleaks reported by LeakSanitizer (Linux) +* Fix potential memory curruption bug in unicode.c (Windows) Logo: * Update Windows 11 ASCII logo to look more visually consistent (#445) diff --git a/src/util/windows/unicode.c b/src/util/windows/unicode.c index 57b3677aa..cf75a071c 100644 --- a/src/util/windows/unicode.c +++ b/src/util/windows/unicode.c @@ -17,20 +17,17 @@ void ffStrbufSetNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) result->chars[size_needed] = '\0'; } -FFstrbuf ffStrbufCreateNWS(uint32_t length, const wchar_t* source) +void ffStrbufInitNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) { - FFstrbuf result; - - if(length == 0) - ffStrbufInit(&result); - else + if(!length) { - int size_needed = WideCharToMultiByte(CP_UTF8, 0, source, (int)length, NULL, 0, NULL, NULL); - ffStrbufInitA(&result, (uint32_t)size_needed); - WideCharToMultiByte(CP_UTF8, 0, source, (int)length, result.chars, size_needed, NULL, NULL); - result.length = (uint32_t)size_needed; - result.chars[size_needed] = '\0'; + ffStrbufInit(result); + return; } - return result; + int size_needed = WideCharToMultiByte(CP_UTF8, 0, source, (int)length, NULL, 0, NULL, NULL); + ffStrbufInitA(result, (uint32_t)size_needed + 1); + WideCharToMultiByte(CP_UTF8, 0, source, (int)length, result->chars, size_needed, NULL, NULL); + result->length = (uint32_t)size_needed; + result->chars[size_needed] = '\0'; } diff --git a/src/util/windows/unicode.h b/src/util/windows/unicode.h index f01080b0a..6892134dc 100644 --- a/src/util/windows/unicode.h +++ b/src/util/windows/unicode.h @@ -13,7 +13,19 @@ static inline void ffStrbufSetWS(FFstrbuf* result, const wchar_t* source) return ffStrbufSetNWS(result, (uint32_t)wcslen(source), source); } -FFstrbuf ffStrbufCreateNWS(uint32_t length, const wchar_t* source); +void ffStrbufInitNWS(FFstrbuf* result, uint32_t length, const wchar_t* source); + +static inline void ffStrbufInitWS(FFstrbuf* result, const wchar_t* source) +{ + return ffStrbufInitNWS(result, (uint32_t)wcslen(source), source); +} + +static inline FFstrbuf ffStrbufCreateNWS(uint32_t length, const wchar_t* source) +{ + FFstrbuf result; + ffStrbufInitNWS(&result, length, source); + return result; +} static inline FFstrbuf ffStrbufCreateWS(const wchar_t* source) {