[PATCH] wldap32: Use correct integer type when calling ber_printf() or ber_scanf().

Conor McCarthy cmccarthy at codeweavers.com
Wed Jul 17 01:52:06 CDT 2019


GCC compiles ber_tag_t and ber_len_t as 64-bit types on 64-bit machines,
but in Win64 they are 32-bit. As va_list arguments they pass unchecked and
unconverted.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 dlls/wldap32/ber.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/dlls/wldap32/ber.c b/dlls/wldap32/ber.c
index c2c6f269..d8fd502d 100644
--- a/dlls/wldap32/ber.c
+++ b/dlls/wldap32/ber.c
@@ -353,7 +353,7 @@ INT WINAPIV WLDAP32_ber_printf( BerElement *berelement, PCHAR fmt, ... )
             }
         case 't':
             {
-                unsigned int tag = va_arg( list, unsigned int );
+                ber_tag_t tag = va_arg( list, ULONG );
                 ret = ber_printf( berelement, new_fmt, tag );
                 break;
             }
@@ -372,7 +372,7 @@ INT WINAPIV WLDAP32_ber_printf( BerElement *berelement, PCHAR fmt, ... )
         case 'X':
             {
                 char *str = va_arg( list, char * );
-                int len = va_arg( list, int );
+                ber_len_t len = va_arg( list, ULONG );
                 new_fmt[0] = 'B';  /* 'X' is deprecated */
                 ret = ber_printf( berelement, new_fmt, str, len );
                 break;
@@ -447,8 +447,10 @@ INT WINAPIV WLDAP32_ber_scanf( BerElement *berelement, PCHAR fmt, ... )
             }
         case 't':
             {
-                unsigned int *tag = va_arg( list, unsigned int * );
-                ret = ber_scanf( berelement, new_fmt, tag );
+                ULONG *tag = va_arg( list, ULONG * );
+                ber_tag_t ber_tag;
+                ret = ber_scanf( berelement, new_fmt, &ber_tag );
+                *tag = ber_tag;
                 break;
             }
         case 'v':
@@ -460,8 +462,10 @@ INT WINAPIV WLDAP32_ber_scanf( BerElement *berelement, PCHAR fmt, ... )
         case 'B':
             {
                 char **str = va_arg( list, char ** );
-                int *len = va_arg( list, int * );
-                ret = ber_scanf( berelement, new_fmt, str, len );
+                ULONG *len = va_arg( list, ULONG * );
+                ber_len_t ber_len;
+                ret = ber_scanf( berelement, new_fmt, str, &ber_len );
+                *len = ber_len;
                 break;
             }
         case 'O':
-- 
2.22.0




More information about the wine-devel mailing list