[Openvpn-devel,v2] Format Windows error message in Unicode

Message ID 20230418141446.1755363-1-selva.nair@gmail.com
State Accepted
Headers show
Series [Openvpn-devel,v2] Format Windows error message in Unicode | expand

Commit Message

Selva Nair April 18, 2023, 2:14 p.m. UTC
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(-)

Comments

Frank Lichtenheld April 18, 2023, 2:21 p.m. UTC | #1
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,
Gert Doering May 4, 2023, 2:21 p.m. UTC | #2
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

Patch

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