Rob Shearman : rpcrt4: Fix the check in NdrPointerFree.

Alexandre Julliard julliard at winehq.org
Fri Dec 14 07:39:35 CST 2007


Module: wine
Branch: master
Commit: d5ff3467bca0781d1e4f8a4247b985a0f5a45518
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d5ff3467bca0781d1e4f8a4247b985a0f5a45518

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu Dec 13 16:11:58 2007 +0000

rpcrt4: Fix the check in NdrPointerFree.

Add comments to justify why this is the only check that is needed.

---

 dlls/rpcrt4/ndr_marshall.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index 0fd2456..b57f0a3 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -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) {




More information about the wine-cvs mailing list