Alexandre Julliard : rpcrt4: Fix parameter stack size computation in the old-style stubless marshaller.

Alexandre Julliard julliard at winehq.org
Fri Jun 10 11:16:20 CDT 2011


Module: wine
Branch: master
Commit: 87cf6ec75d5a2822d1f0af7fd7f3037262a3406b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=87cf6ec75d5a2822d1f0af7fd7f3037262a3406b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jun  7 20:44:16 2011 +0200

rpcrt4: Fix parameter stack size computation in the old-style stubless marshaller.

---

 dlls/rpcrt4/ndr_stubless.c |   42 +++++++++++++++---------------------------
 1 files changed, 15 insertions(+), 27 deletions(-)

diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index 64b5f12..173ff61 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -412,26 +412,23 @@ static unsigned int type_stack_size(unsigned char fc)
     case RPC_FC_CHAR:
     case RPC_FC_SMALL:
     case RPC_FC_USMALL:
-        return sizeof(char);
     case RPC_FC_WCHAR:
     case RPC_FC_SHORT:
     case RPC_FC_USHORT:
-        return sizeof(short);
     case RPC_FC_LONG:
     case RPC_FC_ULONG:
+    case RPC_FC_INT3264:
+    case RPC_FC_UINT3264:
     case RPC_FC_ENUM16:
     case RPC_FC_ENUM32:
-        return sizeof(int);
     case RPC_FC_FLOAT:
-        return sizeof(float);
+    case RPC_FC_ERROR_STATUS_T:
+    case RPC_FC_IGNORE:
+        return sizeof(void *);
     case RPC_FC_DOUBLE:
         return sizeof(double);
     case RPC_FC_HYPER:
         return sizeof(ULONGLONG);
-    case RPC_FC_ERROR_STATUS_T:
-        return sizeof(error_status_t);
-    case RPC_FC_IGNORE:
-        return sizeof(void *);
     default:
         ERR("invalid base type 0x%x\n", fc);
         RpcRaiseException(RPC_S_INTERNAL_ERROR);
@@ -463,7 +460,7 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
     /* current format string offset */
     int current_offset = 0;
     /* current stack offset */
-    unsigned short current_stack_offset = 0;
+    unsigned short current_stack_offset = object_proc ? sizeof(void *) : 0;
     /* counter */
     unsigned short i;
 
@@ -475,19 +472,15 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
     {
         const NDR_PARAM_OI_BASETYPE *pParam =
             (const NDR_PARAM_OI_BASETYPE *)&pFormat[current_offset];
-        /* note: current_stack_offset starts after the This pointer
-         * if present, so adjust this */
-        unsigned short current_stack_offset_adjusted = current_stack_offset +
-            (object_proc ? sizeof(void *) : 0);
-        unsigned char * pArg = ARG_FROM_OFFSET(args, current_stack_offset_adjusted);
+        unsigned char * pArg = ARG_FROM_OFFSET(args, current_stack_offset);
 
         /* no more parameters; exit loop */
-        if (current_stack_offset_adjusted >= stack_size)
+        if (current_stack_offset >= stack_size)
             break;
 
         TRACE("param[%d]: old format\n", i);
         TRACE("\tparam_direction: 0x%x\n", pParam->param_direction);
-        TRACE("\tstack_offset: 0x%x\n", current_stack_offset_adjusted);
+        TRACE("\tstack_offset: 0x%x\n", current_stack_offset);
         TRACE("\tmemory addr (before): %p\n", pArg);
 
         if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE ||
@@ -567,10 +560,9 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
                 RpcRaiseException(RPC_S_INTERNAL_ERROR);
             }
 
-            current_stack_offset += pParamOther->stack_size * sizeof(INT);
+            current_stack_offset += pParamOther->stack_size * sizeof(void *);
             current_offset += sizeof(NDR_PARAM_OI_OTHER);
         }
-        TRACE("\tmemory addr (after): %p\n", pArg);
     }
 }
 
@@ -1242,7 +1234,7 @@ static LONG_PTR *stub_do_old_args(MIDL_STUB_MESSAGE *pStubMsg,
     /* current format string offset */
     int current_offset = 0;
     /* current stack offset */
-    unsigned short current_stack_offset = 0;
+    unsigned short current_stack_offset = object ? sizeof(void *) : 0;
     /* location to put retval into */
     LONG_PTR *retval_ptr = NULL;
 
@@ -1250,19 +1242,15 @@ static LONG_PTR *stub_do_old_args(MIDL_STUB_MESSAGE *pStubMsg,
     {
         const NDR_PARAM_OI_BASETYPE *pParam =
         (const NDR_PARAM_OI_BASETYPE *)&pFormat[current_offset];
-        /* note: current_stack_offset starts after the This pointer
-         * if present, so adjust this */
-        unsigned short current_stack_offset_adjusted = current_stack_offset +
-            (object ? sizeof(void *) : 0);
-        unsigned char *pArg = args + current_stack_offset_adjusted;
+        unsigned char *pArg = args + current_stack_offset;
 
         /* no more parameters; exit loop */
-        if (current_stack_offset_adjusted >= stack_size)
+        if (current_stack_offset >= stack_size)
             break;
 
         TRACE("param[%d]: old format\n", i);
         TRACE("\tparam_direction: 0x%x\n", pParam->param_direction);
-        TRACE("\tstack_offset: 0x%x\n", current_stack_offset_adjusted);
+        TRACE("\tstack_offset: 0x%x\n", current_stack_offset);
 
         if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE ||
             pParam->param_direction == RPC_FC_RETURN_PARAM_BASETYPE)
@@ -1372,7 +1360,7 @@ static LONG_PTR *stub_do_old_args(MIDL_STUB_MESSAGE *pStubMsg,
                     RpcRaiseException(RPC_S_INTERNAL_ERROR);
             }
 
-            current_stack_offset += pParamOther->stack_size * sizeof(INT);
+            current_stack_offset += pParamOther->stack_size * sizeof(void *);
             current_offset += sizeof(NDR_PARAM_OI_OTHER);
         }
     }




More information about the wine-cvs mailing list