From d8cb1b5a397edf287745372afe9a6457edaf2ae8 Mon Sep 17 00:00:00 2001 From: Selva Nair Date: Tue, 18 Apr 2023 10:14:46 -0400 Subject: [PATCH] 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 (cherry picked from commit fed67642dccbcf115952df0709a98929c1fc52b8) --- src/openvpn/error.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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]"); } -- 2.47.3