- 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>
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>
/* 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]");
}