Rob Shearman : oleaut32: Fix size of memory allocated for byrefs in VARIANT_UserMarshal.

Alexandre Julliard julliard at winehq.org
Mon Nov 30 10:42:42 CST 2009


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Wed Nov 25 09:54:27 2009 +0000

oleaut32: Fix size of memory allocated for byrefs in VARIANT_UserMarshal.

---

 dlls/oleaut32/usrmarshal.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 6ad9bd6..7409fce 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -552,14 +552,29 @@ unsigned char * WINAPI VARIANT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffe
 
     if(header->vt & VT_BYREF)
     {
+        ULONG mem_size;
         Pos += 4;
+
+        switch (header->vt & ~VT_BYREF)
+        {
+        /* these types have a different memory size compared to wire size */
+        case VT_UNKNOWN:
+        case VT_DISPATCH:
+        case VT_BSTR:
+            mem_size = sizeof(void *);
+            break;
+        default:
+            mem_size = type_size;
+            break;
+        }
+
         if (V_VT(pvar) != header->vt)
         {
             VariantClear(pvar);
-            V_BYREF(pvar) = CoTaskMemAlloc(type_size);
+            V_BYREF(pvar) = CoTaskMemAlloc(mem_size);
         }
         else if (!V_BYREF(pvar))
-            V_BYREF(pvar) = CoTaskMemAlloc(type_size);
+            V_BYREF(pvar) = CoTaskMemAlloc(mem_size);
         memcpy(V_BYREF(pvar), Pos, type_size);
         if((header->vt & VT_TYPEMASK) != VT_VARIANT)
             Pos += type_size;




More information about the wine-cvs mailing list