From: Dmitry Timoshkov Subject: [3/3] ole32: PropVariantClear should always reset contents of the passed in PROPVARIANT. Message-Id: <20140416171028.32f30ab2.dmitry@baikal.ru> Date: Wed, 16 Apr 2014 17:10:28 +0900 --- dlls/ole32/ole2.c | 11 ++++++++--- dlls/ole32/tests/propvariant.c | 27 ++++----------------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c index 407ae38..ed454cd 100644 --- a/dlls/ole32/ole2.c +++ b/dlls/ole32/ole2.c @@ -2919,7 +2919,10 @@ HRESULT WINAPI PropVariantClear(PROPVARIANT * pvar) /* [in/out] */ hr = PROPVARIANT_ValidateType(pvar->vt); if (FAILED(hr)) + { + memset(pvar, 0, sizeof(*pvar)); return hr; + } switch(pvar->vt) { @@ -3006,12 +3009,14 @@ HRESULT WINAPI PropVariantClear(PROPVARIANT * pvar) /* [in/out] */ } } else + { WARN("Invalid/unsupported type %d\n", pvar->vt); + hr = STG_E_INVALIDPARAMETER; + } } - ZeroMemory(pvar, sizeof(*pvar)); - - return S_OK; + memset(pvar, 0, sizeof(*pvar)); + return hr; } /*********************************************************************** diff --git a/dlls/ole32/tests/propvariant.c b/dlls/ole32/tests/propvariant.c index 7477b6a..d8d027f 100644 --- a/dlls/ole32/tests/propvariant.c +++ b/dlls/ole32/tests/propvariant.c @@ -187,9 +187,7 @@ static void test_validtypes(void) memset(&propvar, 0x55, sizeof(propvar)); hr = PropVariantClear(&propvar); ok(hr == STG_E_INVALIDPARAMETER, "expected STG_E_INVALIDPARAMETER, got %08x\n", hr); -todo_wine ok(propvar.vt == 0, "expected 0, got %d\n", propvar.vt); -todo_wine ok(U(propvar).uhVal.QuadPart == 0, "expected 0, got %#x/%#x\n", U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); @@ -202,25 +200,16 @@ todo_wine vt = propvar.vt = i; hr = PropVariantClear(&propvar); expect(hr, vt); - if (hr == S_OK) /* FIXME: Remove once Wine is fixed */ - ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", - i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); - else -todo_wine + ok(propvar.vt == 0, "expected 0, got %d\n", propvar.vt); ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); memset(&propvar, 0x55, sizeof(propvar)); U(propvar).pszVal = NULL; - vt = propvar.vt = i | VT_ARRAY; hr = PropVariantClear(&propvar); expect(hr, vt); - if (hr == S_OK) /* FIXME: Remove once Wine is fixed */ - ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", - i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); - else -todo_wine + ok(propvar.vt == 0, "expected 0, got %d\n", propvar.vt); ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); @@ -229,11 +218,7 @@ todo_wine vt = propvar.vt = i | VT_VECTOR; hr = PropVariantClear(&propvar); expect(hr, vt); - if (hr == S_OK) /* FIXME: Remove once Wine is fixed */ - ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", - i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); - else -todo_wine + ok(propvar.vt == 0, "expected 0, got %d\n", propvar.vt); ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); @@ -242,11 +227,7 @@ todo_wine vt = propvar.vt = i | VT_BYREF; hr = PropVariantClear(&propvar); expect(hr, vt); - if (hr == S_OK) /* FIXME: Remove once Wine is fixed */ - ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", - i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); - else -todo_wine + ok(propvar.vt == 0, "expected 0, got %d\n", propvar.vt); ok(U(propvar).uhVal.QuadPart == 0, "%u: expected 0, got %#x/%#x\n", i, U(propvar).uhVal.u.LowPart, U(propvar).uhVal.u.HighPart); } -- 1.9.2