Commit e12b487e authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

rpcrt4: Try to free every non-stack pointer in PointerFree now that NdrFree does…

rpcrt4: Try to free every non-stack pointer in PointerFree now that NdrFree does the sanity checking for us.
parent 9c8c74f3
...@@ -1270,23 +1270,17 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg, ...@@ -1270,23 +1270,17 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg,
m = NdrFreer[*desc & NDR_TABLE_MASK]; m = NdrFreer[*desc & NDR_TABLE_MASK];
if (m) m(pStubMsg, Pointer, desc); if (m) m(pStubMsg, Pointer, desc);
/* we should check if the memory comes from NdrAllocate,
* and deallocate only if so - checking if the pointer is between
* BufferStart and BufferEnd will not always work since the buffer
* may be reallocated when the server wants to marshal the reply */
if (Pointer >= (unsigned char *)pStubMsg->RpcMsg->Buffer ||
Pointer <= (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength)
goto notfree;
if (attr & RPC_FC_P_ONSTACK) { if (attr & RPC_FC_P_ONSTACK) {
TRACE("not freeing stack ptr %p\n", Pointer); TRACE("not freeing stack ptr %p\n", Pointer);
return; return;
} }
/* try to free everything else. NdrFree will do the job of sorting out
* whether we allocated it or whether the app did */
TRACE("freeing %p\n", Pointer); TRACE("freeing %p\n", Pointer);
NdrFree(pStubMsg, Pointer); NdrFree(pStubMsg, Pointer);
return; return;
notfree:
TRACE("not freeing %p\n", Pointer);
} }
/*********************************************************************** /***********************************************************************
......
...@@ -1193,9 +1193,7 @@ todo_wine { ...@@ -1193,9 +1193,7 @@ todo_wine {
my_free_called = 0; my_free_called = 0;
StubMsg.Buffer = StubMsg.BufferStart; StubMsg.Buffer = StubMsg.BufferStart;
NdrPointerFree( &StubMsg, mem, fmtstr_conf_str ); NdrPointerFree( &StubMsg, mem, fmtstr_conf_str );
todo_wine {
ok(my_free_called == 1, "free called %d\n", my_free_called); ok(my_free_called == 1, "free called %d\n", my_free_called);
}
/* Server */ /* Server */
my_alloc_called = 0; my_alloc_called = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment