From: Selva Nair Date: Tue, 18 Apr 2023 14:14:46 +0000 (-0400) Subject: Format Windows error message in Unicode X-Git-Tag: v2.7_alpha1~481 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fed67642dccbcf115952df0709a98929c1fc52b8;p=thirdparty%2Fopenvpn.git Format Windows error message in Unicode - We assume that all text passed to the management interface and written to log file are in Unicode (UTF-8). This is broken by the use of the ANSI version of FormatMessage() for Windows error messages. Fix by using FormatMessageW() and converting the UTF-16 result to UTF-8. v2: assign return value of FormatMessageW() to DWORD, not int Github: fixes OpenVPN/openvpn#319 Signed-off-by: Selva Nair Acked-by: Frank Lichtenheld Message-Id: <20230418141446.1755363-1-selva.nair@gmail.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg26598.html Signed-off-by: Gert Doering --- diff --git a/src/openvpn/error.c b/src/openvpn/error.c index a2c9aa4c9..9a234e679 100644 --- a/src/openvpn/error.c +++ b/src/openvpn/error.c @@ -970,19 +970,24 @@ strerror_win32(DWORD errnum, struct gc_arena *gc) /* format a windows error message */ { - char message[256]; + wchar_t wmessage[256]; + char *message = NULL; struct buffer out = alloc_buf_gc(256, gc); - const int status = FormatMessage( + const DWORD status = FormatMessageW( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, errnum, 0, - message, - sizeof(message), + wmessage, + SIZE(wmessage), NULL); - if (!status) + if (status) + { + message = utf16to8(wmessage, gc); + } + if (!status || !message) { buf_printf(&out, "[Unknown Win32 Error]"); }