Hans Leidekker : wbemprox: Always convert from BSTR.

Alexandre Julliard julliard at winehq.org
Fri Oct 12 11:37:45 CDT 2012


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Oct 12 14:25:13 2012 +0200

wbemprox: Always convert from BSTR.

---

 dlls/wbemprox/class.c            |   21 ++++++++++++++++-----
 dlls/wbemprox/query.c            |   30 +++++++++++++++++++++---------
 dlls/wbemprox/wbemprox_private.h |    3 +++
 3 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/dlls/wbemprox/class.c b/dlls/wbemprox/class.c
index b1fc364..c17e1b3 100644
--- a/dlls/wbemprox/class.c
+++ b/dlls/wbemprox/class.c
@@ -232,6 +232,20 @@ static struct record *create_record( const struct column *columns, UINT num_cols
     return record;
 }
 
+void destroy_array( struct array *array, CIMTYPE type )
+{
+    UINT i, size;
+
+    if (!array) return;
+    if (type == CIM_STRING || type == CIM_DATETIME)
+    {
+        size = get_type_size( type );
+        for (i = 0; i < array->count; i++) heap_free( *(WCHAR **)((char *)array->ptr + i * size) );
+    }
+    heap_free( array->ptr );
+    heap_free( array );
+}
+
 static void destroy_record( struct record *record )
 {
     UINT i;
@@ -241,11 +255,8 @@ static void destroy_record( struct record *record )
     {
         if (record->fields[i].type == CIM_STRING || record->fields[i].type == CIM_DATETIME)
             heap_free( record->fields[i].u.sval );
-        else if ((record->fields[i].type & CIM_FLAG_ARRAY) && record->fields[i].u.aval)
-        {
-            heap_free( record->fields[i].u.aval->ptr );
-            heap_free( record->fields[i].u.aval );
-        }
+        else if (record->fields[i].type & CIM_FLAG_ARRAY)
+            destroy_array( record->fields[i].u.aval, record->fields[i].type & CIM_TYPE_MASK );
     }
     heap_free( record->fields );
     heap_free( record );
diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c
index f2c1782..b48d75d 100644
--- a/dlls/wbemprox/query.c
+++ b/dlls/wbemprox/query.c
@@ -639,8 +639,6 @@ static void set_variant( VARTYPE type, LONGLONG val, void *val_ptr, VARIANT *ret
     V_VT( ret ) = type;
 }
 
-#define CIM_TYPE_MASK 0xfff
-
 HRESULT get_propval( const struct view *view, UINT index, const WCHAR *name, VARIANT *ret,
                      CIMTYPE *type, LONG *flavor )
 {
@@ -750,19 +748,33 @@ static struct array *to_array( VARIANT *var, CIMTYPE *type )
 
     ret->count = bound + 1;
     size = get_type_size( basetype );
-    if (!(ret->ptr = heap_alloc( ret->count * size )))
+    if (!(ret->ptr = heap_alloc_zero( ret->count * size )))
     {
         heap_free( ret );
         return NULL;
     }
     for (i = 0; i < ret->count; i++)
     {
-        if (SafeArrayGetElement( V_ARRAY( var ), &i, (char *)ret->ptr + i * size ) != S_OK)
+        void *ptr = (char *)ret->ptr + i * size;
+        if (vartype == VT_BSTR)
+        {
+            BSTR str;
+            if (SafeArrayGetElement( V_ARRAY( var ), &i, &str ) != S_OK)
+            {
+                destroy_array( ret, basetype );
+                return NULL;
+            }
+            *(WCHAR **)ptr = heap_strdupW( str );
+            SysFreeString( str );
+            if (!*(WCHAR **)ptr)
+            {
+                destroy_array( ret, basetype );
+                return NULL;
+            }
+        }
+        else if (SafeArrayGetElement( V_ARRAY( var ), &i, ptr ) != S_OK)
         {
-            if (vartype == VT_BSTR)
-                for (i--; i >= 0; i--) SysFreeString( *(BSTR *)(char *)ret->ptr + i * size );
-            heap_free( ret->ptr );
-            heap_free( ret );
+            destroy_array( ret, basetype );
             return NULL;
         }
     }
@@ -790,7 +802,7 @@ HRESULT to_longlong( VARIANT *var, LONGLONG *val, CIMTYPE *type )
         *type = CIM_BOOLEAN;
         break;
     case VT_BSTR:
-        *val = (INT_PTR)SysAllocString( V_BSTR( var ) );
+        *val = (INT_PTR)heap_strdupW( V_BSTR( var ) );
         if (!*val) return E_OUTOFMEMORY;
         *type = CIM_STRING;
         break;
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 0f1305e..8de3a0c 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -31,6 +31,8 @@ enum param_direction
     PARAM_IN    = 1
 };
 
+#define CIM_TYPE_MASK    0x00000fff
+
 #define COL_TYPE_MASK    0x0000ffff
 #define COL_FLAG_DYNAMIC 0x00010000
 #define COL_FLAG_KEY     0x00020000
@@ -177,6 +179,7 @@ HRESULT get_propval( const struct view *, UINT, const WCHAR *, VARIANT *,
 HRESULT put_propval( const struct view *, UINT, const WCHAR *, VARIANT *, CIMTYPE ) DECLSPEC_HIDDEN;
 HRESULT to_longlong( VARIANT *, LONGLONG *, CIMTYPE * ) DECLSPEC_HIDDEN;
 SAFEARRAY *to_safearray( const struct array *, CIMTYPE ) DECLSPEC_HIDDEN;
+void destroy_array( struct array *, CIMTYPE ) DECLSPEC_HIDDEN;
 HRESULT get_properties( const struct view *, SAFEARRAY ** ) DECLSPEC_HIDDEN;
 HRESULT get_object( const WCHAR *, IWbemClassObject ** ) DECLSPEC_HIDDEN;
 BSTR get_method_name( const WCHAR *, UINT ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list