Mafia III launcher crashes when querying video controllers after passing the NULL __PATH value through COM marshalling.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/wbemprox/query.c | 1 + dlls/wbemprox/tests/query.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+)
diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c index 6ac5ad5b770..ad7150e5401 100644 --- a/dlls/wbemprox/query.c +++ b/dlls/wbemprox/query.c @@ -962,6 +962,7 @@ static HRESULT get_system_propval( const struct view *view, UINT table_index, UI { V_VT( ret ) = VT_BSTR; V_BSTR( ret ) = build_path( view, table_index, result_index, name ); + if (!V_BSTR( ret )) V_VT( ret ) = VT_NULL; } if (type) *type = CIM_STRING; return S_OK; diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c index 74fdfaa9bc8..357b0a8b8e5 100644 --- a/dlls/wbemprox/tests/query.c +++ b/dlls/wbemprox/tests/query.c @@ -1414,6 +1414,8 @@ static void test_Win32_VideoController( IWbemServices *services ) hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); if (hr != S_OK) break;
+ check_property( obj, L"__GENUS", VT_I4, CIM_SINT32 ); + check_property( obj, L"__PATH", VT_BSTR, CIM_STRING ); check_property( obj, L"AdapterCompatibility", VT_BSTR, CIM_STRING ); check_property( obj, L"Availability", VT_I4, CIM_UINT16 ); check_property( obj, L"ConfigManagerErrorCode", VT_I4, CIM_UINT32 ); @@ -1432,6 +1434,27 @@ static void test_Win32_VideoController( IWbemServices *services ) IWbemClassObject_Release( obj ); }
+ IEnumWbemClassObject_Release( result ); + SysFreeString( query ); + + query = SysAllocString( L"SELECT AdapterRAM FROM Win32_VideoController" ); + hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); + if (hr != S_OK) + { + win_skip( "Win32_VideoController not available\n" ); + return; + } + + for (;;) + { + hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); + if (hr != S_OK) break; + check_property( obj, L"__GENUS", VT_I4, CIM_SINT32 ); + check_property( obj, L"__PATH", VT_NULL, CIM_STRING ); + check_property( obj, L"AdapterRAM", VT_I4, CIM_UINT32 ); + IWbemClassObject_Release( obj ); + } + IEnumWbemClassObject_Release( result ); SysFreeString( query ); SysFreeString( wql );