Nikolay Sivov : wbemdisp: Coerce property value before setting it in ISWbemObject::Invoke().

Alexandre Julliard julliard at winehq.org
Tue Mar 2 15:35:58 CST 2021


Module: wine
Branch: master
Commit: 65ed5d9cc6e3f74275ca2928b62e4d2deed2fc32
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=65ed5d9cc6e3f74275ca2928b62e4d2deed2fc32

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Mar  2 09:25:05 2021 +0300

wbemdisp: Coerce property value before setting it in ISWbemObject::Invoke().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wbemdisp/locator.c | 54 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index 59a8150a155..8c37cc92eb1 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -1199,16 +1199,51 @@ static HRESULT WINAPI object_GetIDsOfNames(
     return S_OK;
 }
 
-static BSTR get_member_name( struct object *object, DISPID dispid )
+static BSTR get_member_name( struct object *object, DISPID dispid, CIMTYPE *type )
 {
     UINT i;
     for (i = 0; i < object->nb_members; i++)
     {
-        if (object->members[i].dispid == dispid) return object->members[i].name;
+        if (object->members[i].dispid == dispid)
+        {
+            *type = object->members[i].type;
+            return object->members[i].name;
+        }
     }
     return NULL;
 }
 
+static VARTYPE to_vartype( CIMTYPE type )
+{
+    switch (type)
+    {
+    case CIM_BOOLEAN:   return VT_BOOL;
+
+    case CIM_STRING:
+    case CIM_REFERENCE:
+    case CIM_DATETIME:  return VT_BSTR;
+
+    case CIM_SINT8:     return VT_I1;
+    case CIM_UINT8:     return VT_UI1;
+    case CIM_SINT16:    return VT_I2;
+
+    case CIM_UINT16:
+    case CIM_SINT32:    return VT_I4;
+
+    case CIM_UINT32:    return VT_UI4;
+
+    case CIM_SINT64:    return VT_I8;
+    case CIM_UINT64:    return VT_UI8;
+
+    case CIM_REAL32:    return VT_R4;
+
+    default:
+        ERR("unhandled type %u\n", type);
+        break;
+    }
+    return 0;
+}
+
 static HRESULT WINAPI object_Invoke(
     ISWbemObject *iface,
     DISPID member,
@@ -1223,6 +1258,9 @@ static HRESULT WINAPI object_Invoke(
     struct object *object = impl_from_ISWbemObject( iface );
     BSTR name;
     ITypeInfo *typeinfo;
+    VARTYPE vartype;
+    VARIANT value;
+    CIMTYPE type;
     HRESULT hr;
 
     TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object, member, debugstr_guid(riid),
@@ -1240,7 +1278,7 @@ static HRESULT WINAPI object_Invoke(
         return hr;
     }
 
-    if (!(name = get_member_name( object, member )))
+    if (!(name = get_member_name( object, member, &type )))
         return DISP_E_MEMBERNOTFOUND;
 
     if (flags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET))
@@ -1255,7 +1293,15 @@ static HRESULT WINAPI object_Invoke(
             WARN( "Missing put property value\n" );
             return E_INVALIDARG;
         }
-        return IWbemClassObject_Put( object->object, name, 0, params->rgvarg, 0 );
+
+        vartype = to_vartype( type );
+        V_VT( &value ) = VT_EMPTY;
+        if (SUCCEEDED(hr = VariantChangeType( &value, params->rgvarg, 0, vartype )))
+        {
+            hr = IWbemClassObject_Put( object->object, name, 0, &value, 0 );
+            VariantClear( &value );
+        }
+        return hr;
     }
     else
     {




More information about the wine-cvs mailing list