rpcrt4: Add a STUBLESS_FREE phase for freeing the allocated memory in the server function.

This commit is contained in:
Rob Shearman 2007-06-25 14:22:29 +01:00 committed by Alexandre Julliard
parent a1dca20dd7
commit 903fb72b21
1 changed files with 39 additions and 5 deletions
dlls/rpcrt4

View File

@ -121,6 +121,7 @@ static inline unsigned long call_memory_sizer(PMIDL_STUB_MESSAGE pStubMsg, PFORM
#define STUBLESS_CALCSIZE 3
#define STUBLESS_GETBUFFER 4
#define STUBLESS_MARSHAL 5
#define STUBLESS_FREE 6
/* From http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/parameter_descriptors.asp */
typedef struct _NDR_PROC_HEADER
@ -1258,7 +1259,7 @@ LONG WINAPI NdrStubCall2(
* 4. STUBLESS_GETBUFFER - allocate [out] buffer
* 5. STUBLESS_MARHSAL - marshal [out] params to buffer
*/
for (phase = STUBLESS_UNMARSHAL; phase <= STUBLESS_MARSHAL; phase++)
for (phase = STUBLESS_UNMARSHAL; phase <= STUBLESS_FREE; phase++)
{
TRACE("phase = %d\n", phase);
switch (phase)
@ -1316,6 +1317,7 @@ LONG WINAPI NdrStubCall2(
case STUBLESS_MARSHAL:
case STUBLESS_UNMARSHAL:
case STUBLESS_CALCSIZE:
case STUBLESS_FREE:
current_offset = parameter_start_offset;
current_stack_offset = 0;
@ -1357,6 +1359,10 @@ LONG WINAPI NdrStubCall2(
call_marshaller(&stubMsg, pArg, pTypeFormat);
}
break;
case STUBLESS_FREE:
if (pParam->param_attributes.ServerAllocSize)
HeapFree(GetProcessHeap(), 0, *(void **)pArg);
break;
case STUBLESS_UNMARSHAL:
if (pParam->param_attributes.ServerAllocSize)
*(void **)pArg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
@ -1408,12 +1414,29 @@ LONG WINAPI NdrStubCall2(
if (pParam->param_attributes.IsByValue)
call_marshaller(&stubMsg, pArg, pTypeFormat);
else
{
call_marshaller(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
}
break;
case STUBLESS_FREE:
if (pParam->param_attributes.MustFree)
{
if (pParam->param_attributes.IsByValue)
call_freer(&stubMsg, pArg, pTypeFormat);
else
call_freer(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
}
if (pParam->param_attributes.IsOut &&
!pParam->param_attributes.IsIn &&
!pParam->param_attributes.IsByValue &&
!pParam->param_attributes.ServerAllocSize)
{
stubMsg.pfnFree(*(void **)pArg);
}
}
/* FIXME: call call_freer here for IN types */
if (pParam->param_attributes.ServerAllocSize)
HeapFree(GetProcessHeap(), 0, *(void **)pArg);
/* FIXME: call call_freer here for IN types with MustFree set */
break;
case STUBLESS_UNMARSHAL:
if (pParam->param_attributes.ServerAllocSize)
@ -1489,6 +1512,10 @@ LONG WINAPI NdrStubCall2(
if (pParam->param_direction == RPC_FC_RETURN_PARAM_BASETYPE)
call_marshaller(&stubMsg, pArg, pTypeFormat);
break;
case STUBLESS_FREE:
if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE)
call_freer(&stubMsg, pArg, pTypeFormat);
break;
case STUBLESS_UNMARSHAL:
if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE)
call_unmarshaller(&stubMsg, &pArg, pTypeFormat, 0);
@ -1524,6 +1551,13 @@ LONG WINAPI NdrStubCall2(
pParam->param_direction == RPC_FC_RETURN_PARAM)
call_marshaller(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
break;
case STUBLESS_FREE:
if (pParam->param_direction == RPC_FC_IN_OUT_PARAM ||
pParam->param_direction == RPC_FC_IN_PARAM)
call_freer(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
else if (pParam->param_direction == RPC_FC_OUT_PARAM)
stubMsg.pfnFree(*(void **)pArg);
break;
case STUBLESS_UNMARSHAL:
if (pParam->param_direction == RPC_FC_IN_OUT_PARAM ||
pParam->param_direction == RPC_FC_IN_PARAM)