rpcrt4: Fix the check in NdrPointerFree.

Add comments to justify why this is the only check that is needed.
This commit is contained in:
Rob Shearman 2007-12-13 16:11:58 +00:00 committed by Alexandre Julliard
parent 9d8ebc1a24
commit d5ff3467bc
1 changed files with 8 additions and 6 deletions

View File

@ -1270,12 +1270,14 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg,
m = NdrFreer[*desc & NDR_TABLE_MASK];
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)
/* this check stops us from trying to free buffer memory. we don't have to
* worry about clients, since they won't call this function.
* we don't have to check for the buffer being reallocated because
* BufferStart and BufferEnd won't be reset when allocating memory for
* sending the response. we don't have to check for the new buffer here as
* it won't be used a type memory, only for buffer memory */
if (Pointer >= (unsigned char *)pStubMsg->BufferStart &&
Pointer < (unsigned char *)pStubMsg->BufferEnd)
goto notfree;
if (attr & RPC_FC_P_ONSTACK) {