PATCH: sysreallocstringlen

Marcus Meissner marcus at jet.franken.de
Sun Jan 26 16:00:44 CST 2003


Hi,

Undocumented feature, the stringbase reallocated by SysReAllocStringLen
is from the old BSTR, when 'in' is NULL.

This 'feature' is requird by a MS VB5 app installer.

Ciao, Marcus

Changelog:
	Do not free the old string in SysReAllocStringLen, reuse
	the old string memory (if 'in' is NULL).

Index: dlls/oleaut32/oleaut.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut.c,v
retrieving revision 1.27
diff -u -u -r1.27 oleaut.c
--- dlls/oleaut32/oleaut.c	5 Jan 2003 20:32:30 -0000	1.27
+++ dlls/oleaut32/oleaut.c	26 Jan 2003 21:57:32 -0000
@@ -206,16 +206,26 @@
     if (old==NULL)
       return 0;
 
-    /*
-     * Make sure we free the old string.
-     */
-    if (*old!=NULL)
-      SysFreeString(*old);
-
-    /*
-     * Allocate the new string
-     */
-    *old = SysAllocStringLen(in, len);
+    if (*old!=NULL) {
+      DWORD newbytelen = len*sizeof(WCHAR);
+      DWORD *ptr = HeapReAlloc(GetProcessHeap(),0,((DWORD*)*old)-1,newbytelen+sizeof(WCHAR)+sizeof(DWORD));
+      *old = (BSTR)(ptr+1);
+      *ptr = newbytelen;
+      if (in) {
+        memcpy(*old, in, newbytelen);
+        (*old)[newbytelen] = 0;
+      } else {
+	/* Subtle hidden feature: The old string data is still there
+	 * when 'in' is NULL! 
+	 * Some Microsoft program needs it.
+	 */
+      }
+    } else {
+      /*
+       * Allocate the new string
+       */
+      *old = SysAllocStringLen(in, len);
+    }
 
     return 1;
 }



More information about the wine-patches mailing list