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