From d4d9b840cc4ed4fa5df61d321eae570be12e2457 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Fri, 28 Dec 2018 21:18:07 +0200 Subject: windows.c: fix wrong usage of wcslen() for utf8 conversation wcslen() returns the number of characters in a wchar_t string. In the case of WideCharToMultiByte() an estimate for the size of the utf8 buffer is needed. Using wcslen() is incorrect for such a buffer, because for any non-ASCII character the estimate will be off by 1 byte. Call the following instead to obtain the proper UTF8 buffer size for the conversation: WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL); Also fix some missing "\n" in fprintf() calls. Signed-off-by: Lubomir I. Ivanov --- core/windows.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'core/windows.c') diff --git a/core/windows.c b/core/windows.c index 77b7f5755..85ef1bbf2 100644 --- a/core/windows.c +++ b/core/windows.c @@ -50,16 +50,20 @@ static char *utf16_to_utf8_fl(const wchar_t *utf16, char *file, int line) assert(file != NULL); assert(line); /* estimate buffer size */ - const int sz = wcslen(utf16) + 1; + const int sz = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL); + if (!sz) { + fprintf(stderr, "%s:%d: cannot estimate buffer size\n", file, line); + return NULL; + } char *utf8 = (char *)malloc(sz); if (!utf8) { - fprintf(stderr, "%s:%d: %s %d.", file, line, "cannot allocate buffer of size", sz); + fprintf(stderr, "%s:%d: cannot allocate buffer of size: %d\n", file, line, sz); return NULL; } if (WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, sz, NULL, NULL)) { return utf8; } - fprintf(stderr, "%s:%d: %s", file, line, "cannot convert string."); + fprintf(stderr, "%s:%d: cannot convert string\n", file, line); free((void *)utf8); return NULL; } @@ -78,12 +82,12 @@ static wchar_t *utf8_to_utf16_fl(const char *utf8, char *file, int line) const int sz = strlen(utf8) + 1; wchar_t *utf16 = (wchar_t *)malloc(sizeof(wchar_t) * sz); if (!utf16) { - fprintf(stderr, "%s:%d: %s %d.", file, line, "cannot allocate buffer of size", sz); + fprintf(stderr, "%s:%d: cannot allocate buffer of size: %d\n", file, line, sz); return NULL; } if (MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, sz)) return utf16; - fprintf(stderr, "%s:%d: %s", file, line, "cannot convert string."); + fprintf(stderr, "%s:%d: cannot convert string\n", file, line); free((void *)utf16); return NULL; } -- cgit v1.2.3-70-g09d2