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