Zebediah Figura : rpcrt4: Also clear base-type [out] pointers in client_do_args().

Alexandre Julliard julliard at winehq.org
Mon Oct 15 16:15:27 CDT 2018


Module: wine
Branch: master
Commit: be25106503bc71f0dc82c50bc9c5a90651fbeebd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=be25106503bc71f0dc82c50bc9c5a90651fbeebd

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sat Oct 13 17:46:43 2018 -0500

rpcrt4: Also clear base-type [out] pointers in client_do_args().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/rpcrt4/ndr_stubless.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index 6a65a14..c2f260c 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -427,6 +427,45 @@ static inline BOOL param_needs_alloc( PARAM_ATTRIBUTES attr )
     return attr.IsOut && !attr.IsIn && !attr.IsBasetype && !attr.IsByValue;
 }
 
+static inline BOOL param_is_out_basetype( PARAM_ATTRIBUTES attr )
+{
+    return attr.IsOut && !attr.IsIn && attr.IsBasetype && attr.IsSimpleRef;
+}
+
+static size_t basetype_arg_size( unsigned char fc )
+{
+    switch (fc)
+    {
+    case FC_BYTE:
+    case FC_CHAR:
+    case FC_SMALL:
+    case FC_USMALL:
+        return sizeof(char);
+    case FC_WCHAR:
+    case FC_SHORT:
+    case FC_USHORT:
+        return sizeof(short);
+    case FC_LONG:
+    case FC_ULONG:
+    case FC_ENUM16:
+    case FC_ENUM32:
+    case FC_ERROR_STATUS_T:
+        return sizeof(int);
+    case FC_FLOAT:
+        return sizeof(float);
+    case FC_HYPER:
+        return sizeof(LONGLONG);
+    case FC_DOUBLE:
+        return sizeof(double);
+    case FC_INT3264:
+    case FC_UINT3264:
+        return sizeof(INT_PTR);
+    default:
+        FIXME("Unhandled basetype %#x.\n", fc);
+        return 0;
+    }
+}
+
 void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase,
                      void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal )
 {
@@ -458,8 +497,13 @@ void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum s
         switch (phase)
         {
         case STUBLESS_INITOUT:
-            if (param_needs_alloc(params[i].attr) && *(unsigned char **)pArg)
-                memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
+            if (*(unsigned char **)pArg)
+            {
+                if (param_needs_alloc(params[i].attr))
+                    memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
+                else if (param_is_out_basetype(params[i].attr))
+                    memset( *(unsigned char **)pArg, 0, basetype_arg_size( params[i].u.type_format_char ));
+            }
             break;
         case STUBLESS_CALCSIZE:
             if (params[i].attr.IsSimpleRef && !*(unsigned char **)pArg)




More information about the wine-cvs mailing list