yet more rpc stuff

Ove Kaaven ovek at arcticnet.no
Tue May 20 10:24:57 CDT 2003


Log:
Ove Kaaven <ovek at transgaming.com>
For RPC servers, don't deallocate the RPC request packet before the RPC
reply packet is sent, in case marshalling the reply needs any of the
request data.

Index: dlls/rpcrt4/rpc_message.c
===================================================================
RCS file: /home/wine/wine/dlls/rpcrt4/rpc_message.c,v
retrieving revision 1.5
diff -u -r1.5 rpc_message.c
--- dlls/rpcrt4/rpc_message.c	19 Feb 2003 03:44:35 -0000	1.5
+++ dlls/rpcrt4/rpc_message.c	20 May 2003 15:17:15 -0000
@@ -46,11 +46,19 @@
  */
 RPC_STATUS WINAPI I_RpcGetBuffer(PRPC_MESSAGE pMsg)
 {
+  RpcBinding* bind = (RpcBinding*)pMsg->Handle;
   void* buf;
 
   TRACE("(%p): BufferLength=%d\n", pMsg, pMsg->BufferLength);
   /* FIXME: pfnAllocate? */
-  buf = HeapReAlloc(GetProcessHeap(), 0, pMsg->Buffer, pMsg->BufferLength);
+  if (bind->server) {
+    /* it turns out that the original buffer data must still be available
+     * while the RPC server is marshalling a reply, so we should not deallocate
+     * it, we'll leave deallocating the original buffer to the RPC server */
+    buf = HeapAlloc(GetProcessHeap(), 0, pMsg->BufferLength);
+  } else {
+    buf = HeapReAlloc(GetProcessHeap(), 0, pMsg->Buffer, pMsg->BufferLength);
+  }
   TRACE("Buffer=%p\n", buf);
   if (buf) pMsg->Buffer = buf;
   /* FIXME: which errors to return? */
@@ -62,7 +70,7 @@
  */
 RPC_STATUS WINAPI I_RpcFreeBuffer(PRPC_MESSAGE pMsg)
 {
-  TRACE("(%p)\n", pMsg);
+  TRACE("(%p) Buffer=%p\n", pMsg, pMsg->Buffer);
   /* FIXME: pfnFree? */
   HeapFree(GetProcessHeap(), 0, pMsg->Buffer);
   pMsg->Buffer = NULL;
Index: dlls/rpcrt4/rpc_server.c
===================================================================
RCS file: /home/wine/wine/dlls/rpcrt4/rpc_server.c,v
retrieving revision 1.15
diff -u -r1.15 rpc_server.c
--- dlls/rpcrt4/rpc_server.c	19 Apr 2003 20:06:42 -0000	1.15
+++ dlls/rpcrt4/rpc_server.c	20 May 2003 15:17:15 -0000
@@ -171,7 +171,10 @@
   }
 
   /* clean up */
-  HeapFree(GetProcessHeap(), 0, msg.Buffer);
+  if (msg.Buffer == buf) msg.Buffer = NULL;
+  TRACE("freeing Buffer=%p\n", buf);
+  HeapFree(GetProcessHeap(), 0, buf);
+  I_RpcFreeBuffer(&msg);
   msg.Buffer = NULL;
 }
 






More information about the wine-patches mailing list