rpcrt4: Add a STUBLESS_FREE phase for freeing the allocated memory in the server function.
This commit is contained in:
parent
a1dca20dd7
commit
903fb72b21
|
@ -121,6 +121,7 @@ static inline unsigned long call_memory_sizer(PMIDL_STUB_MESSAGE pStubMsg, PFORM
|
||||||
#define STUBLESS_CALCSIZE 3
|
#define STUBLESS_CALCSIZE 3
|
||||||
#define STUBLESS_GETBUFFER 4
|
#define STUBLESS_GETBUFFER 4
|
||||||
#define STUBLESS_MARSHAL 5
|
#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 */
|
/* From http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/parameter_descriptors.asp */
|
||||||
typedef struct _NDR_PROC_HEADER
|
typedef struct _NDR_PROC_HEADER
|
||||||
|
@ -1258,7 +1259,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
* 4. STUBLESS_GETBUFFER - allocate [out] buffer
|
* 4. STUBLESS_GETBUFFER - allocate [out] buffer
|
||||||
* 5. STUBLESS_MARHSAL - marshal [out] params to 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);
|
TRACE("phase = %d\n", phase);
|
||||||
switch (phase)
|
switch (phase)
|
||||||
|
@ -1316,6 +1317,7 @@ LONG WINAPI NdrStubCall2(
|
||||||
case STUBLESS_MARSHAL:
|
case STUBLESS_MARSHAL:
|
||||||
case STUBLESS_UNMARSHAL:
|
case STUBLESS_UNMARSHAL:
|
||||||
case STUBLESS_CALCSIZE:
|
case STUBLESS_CALCSIZE:
|
||||||
|
case STUBLESS_FREE:
|
||||||
current_offset = parameter_start_offset;
|
current_offset = parameter_start_offset;
|
||||||
current_stack_offset = 0;
|
current_stack_offset = 0;
|
||||||
|
|
||||||
|
@ -1357,6 +1359,10 @@ LONG WINAPI NdrStubCall2(
|
||||||
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case STUBLESS_FREE:
|
||||||
|
if (pParam->param_attributes.ServerAllocSize)
|
||||||
|
HeapFree(GetProcessHeap(), 0, *(void **)pArg);
|
||||||
|
break;
|
||||||
case STUBLESS_UNMARSHAL:
|
case STUBLESS_UNMARSHAL:
|
||||||
if (pParam->param_attributes.ServerAllocSize)
|
if (pParam->param_attributes.ServerAllocSize)
|
||||||
*(void **)pArg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
*(void **)pArg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
|
@ -1408,12 +1414,29 @@ LONG WINAPI NdrStubCall2(
|
||||||
if (pParam->param_attributes.IsByValue)
|
if (pParam->param_attributes.IsByValue)
|
||||||
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
call_marshaller(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
|
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);
|
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;
|
break;
|
||||||
case STUBLESS_UNMARSHAL:
|
case STUBLESS_UNMARSHAL:
|
||||||
if (pParam->param_attributes.ServerAllocSize)
|
if (pParam->param_attributes.ServerAllocSize)
|
||||||
|
@ -1489,6 +1512,10 @@ LONG WINAPI NdrStubCall2(
|
||||||
if (pParam->param_direction == RPC_FC_RETURN_PARAM_BASETYPE)
|
if (pParam->param_direction == RPC_FC_RETURN_PARAM_BASETYPE)
|
||||||
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
call_marshaller(&stubMsg, pArg, pTypeFormat);
|
||||||
break;
|
break;
|
||||||
|
case STUBLESS_FREE:
|
||||||
|
if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE)
|
||||||
|
call_freer(&stubMsg, pArg, pTypeFormat);
|
||||||
|
break;
|
||||||
case STUBLESS_UNMARSHAL:
|
case STUBLESS_UNMARSHAL:
|
||||||
if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE)
|
if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE)
|
||||||
call_unmarshaller(&stubMsg, &pArg, pTypeFormat, 0);
|
call_unmarshaller(&stubMsg, &pArg, pTypeFormat, 0);
|
||||||
|
@ -1524,6 +1551,13 @@ LONG WINAPI NdrStubCall2(
|
||||||
pParam->param_direction == RPC_FC_RETURN_PARAM)
|
pParam->param_direction == RPC_FC_RETURN_PARAM)
|
||||||
call_marshaller(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
|
call_marshaller(&stubMsg, *(unsigned char **)pArg, pTypeFormat);
|
||||||
break;
|
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:
|
case STUBLESS_UNMARSHAL:
|
||||||
if (pParam->param_direction == RPC_FC_IN_OUT_PARAM ||
|
if (pParam->param_direction == RPC_FC_IN_OUT_PARAM ||
|
||||||
pParam->param_direction == RPC_FC_IN_PARAM)
|
pParam->param_direction == RPC_FC_IN_PARAM)
|
||||||
|
|
Loading…
Reference in New Issue