Message ID | 20230418141446.1755363-1-selva.nair@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [Openvpn-devel,v2] Format Windows error message in Unicode | expand |
On Tue, Apr 18, 2023 at 10:14:46AM -0400, selva.nair@gmail.com wrote: > From: Selva Nair <selva.nair@gmail.com> > > - 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 <selva.nair@gmail.com> > --- > src/openvpn/error.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) Looks good to me. Acked-By: Frank Lichtenheld <frank@lichtenheld.com> Regards,
I have not tested this myself (as in "trigger a nationalized error message with non-ASCII characters in it"), but have test-built on mingw + GHA. Your patch has been applied to the master and release/2.6 branch. commit fed67642dccbcf115952df0709a98929c1fc52b8 (master) commit d8cb1b5a397edf287745372afe9a6457edaf2ae8 (release/2.6) Author: Selva Nair Date: Tue Apr 18 10:14:46 2023 -0400 Format Windows error message in Unicode Signed-off-by: Selva Nair <selva.nair@gmail.com> Acked-by: Frank Lichtenheld <frank@lichtenheld.com> 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 <gert@greenie.muc.de> -- kind regards, Gert Doering
diff --git a/src/openvpn/error.c b/src/openvpn/error.c index a2c9aa4c..9a234e67 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]"); }