wine/dlls/rpcrt4 ndr_marshall.c

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 28 05:00:06 CST 2005


ChangeSet ID:	21450
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/28 05:00:06

Modified files:
	dlls/rpcrt4    : ndr_marshall.c 

Log message:
	Robert Shearman <rob at codeweavers.com>
	We should always allocate in NdrConformantStringUnmarshal if the
	memory pointer is NULL.

Patch: http://cvs.winehq.org/patch.py?id=21450

Old revision  New revision  Changes     Path
 1.30          1.31          +4 -15      wine/dlls/rpcrt4/ndr_marshall.c

Index: wine/dlls/rpcrt4/ndr_marshall.c
diff -u -p wine/dlls/rpcrt4/ndr_marshall.c:1.30 wine/dlls/rpcrt4/ndr_marshall.c:1.31
--- wine/dlls/rpcrt4/ndr_marshall.c:1.30	28 Nov 2005 11: 0: 6 -0000
+++ wine/dlls/rpcrt4/ndr_marshall.c	28 Nov 2005 11: 0: 6 -0000
@@ -526,7 +526,6 @@ unsigned char *WINAPI NdrConformantStrin
   unsigned char** ppMemory, PFORMAT_STRING pFormat, unsigned char fMustAlloc )
 {
   unsigned long len, esize, ofs;
-  unsigned char *pMem;
 
   TRACE("(pStubMsg == ^%p, *pMemory == ^%p, pFormat == ^%p, fMustAlloc == %u)\n",
     pStubMsg, *ppMemory, pFormat, fMustAlloc);
@@ -551,28 +550,18 @@ unsigned char *WINAPI NdrConformantStrin
     FIXME("sized string format=%d\n", pFormat[1]);
   }
 
-  if (fMustAlloc) {
+  if (fMustAlloc || !*ppMemory)
     *ppMemory = NdrAllocate(pStubMsg, len*esize + BUFFER_PARANOIA);
-  } else {
-    if (pStubMsg->ReuseBuffer && !*ppMemory)
-      /* for servers, we may just point straight into the RPC buffer, I think
-       * (I guess that's what MS does since MIDL code doesn't try to free) */
-      *ppMemory = pStubMsg->Buffer - ofs*esize;
-    /* for clients, memory should be provided by caller */
-  }
-
-  pMem = *ppMemory + ofs*esize;
 
-  if (pMem != pStubMsg->Buffer)
-    memcpy(pMem, pStubMsg->Buffer, len*esize);
+  memcpy(*ppMemory, pStubMsg->Buffer, len*esize);
 
   pStubMsg->Buffer += len*esize;
 
   if (*pFormat == RPC_FC_C_CSTRING) {
-    TRACE("string=%s\n", debugstr_a((char*)pMem));
+    TRACE("string=%s\n", debugstr_a((char*)*ppMemory));
   }
   else if (*pFormat == RPC_FC_C_WSTRING) {
-    TRACE("string=%s\n", debugstr_w((LPWSTR)pMem));
+    TRACE("string=%s\n", debugstr_w((LPWSTR)*ppMemory));
   }
 
   return NULL; /* FIXME: is this always right? */



More information about the wine-cvs mailing list