Dmitry Timoshkov : ole32: PropVariantCopy should return DISP_E_BADVARTYPE in case of bad source variant type.
Module: wine Branch: master Commit: f9bc636d357221dfc036aacf84858257f045a1fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=f9bc636d357221dfc036aacf84... Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Mon Oct 19 10:28:10 2015 +0800 ole32: PropVariantCopy should return DISP_E_BADVARTYPE in case of bad source variant type. In some rare (notably for some VT_VECTOR) cases Windows implementation returns STG_E_INVALIDPARAMETER, but returning DISP_E_BADVARTYPE should cover most of cases. Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ole32/ole2.c | 2 +- dlls/ole32/tests/propvariant.c | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c index 09cbccf..40f7238 100644 --- a/dlls/ole32/ole2.c +++ b/dlls/ole32/ole2.c @@ -3041,7 +3041,7 @@ HRESULT WINAPI PropVariantCopy(PROPVARIANT *pvarDest, /* [out] */ hr = PROPVARIANT_ValidateType(pvarSrc->vt); if (FAILED(hr)) - return hr; + return DISP_E_BADVARTYPE; /* this will deal with most cases */ *pvarDest = *pvarSrc; diff --git a/dlls/ole32/tests/propvariant.c b/dlls/ole32/tests/propvariant.c index c45ca2a..0786a8e 100644 --- a/dlls/ole32/tests/propvariant.c +++ b/dlls/ole32/tests/propvariant.c @@ -130,7 +130,7 @@ static const char* wine_vtypes[VT_CLSID+1] = }; -static void expect(HRESULT hr, VARTYPE vt, BOOL copy) +static void expect(HRESULT hr, VARTYPE vt, BOOL copy, int line) { int idx = vt & VT_TYPEMASK; BYTE flags; @@ -158,7 +158,12 @@ static void expect(HRESULT hr, VARTYPE vt, BOOL copy) } if(flags == PROP_INV) - ok(hr == copy ? DISP_E_BADVARTYPE : STG_E_INVALIDPARAMETER, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); + { + if (copy && (vt & VT_VECTOR)) + ok(hr == DISP_E_BADVARTYPE || hr == STG_E_INVALIDPARAMETER, "%s (%s): got %08x (line %d)\n", wine_vtypes[idx], modifier, hr, line); + else + ok(hr == (copy ? DISP_E_BADVARTYPE : STG_E_INVALIDPARAMETER), "%s (%s): got %08x (line %d)\n", wine_vtypes[idx], modifier, hr, line); + } else if(flags == PROP_V0) ok(hr == S_OK, "%s (%s): got %08x\n", wine_vtypes[idx], modifier, hr); else if(flags & PROP_TODO) @@ -210,7 +215,7 @@ static void test_validtypes(void) vt = propvar.vt = i; memset(©, 0x77, sizeof(copy)); hr = PropVariantCopy(©, &propvar); - expect(hr, vt, TRUE); + expect(hr, vt, TRUE, __LINE__); if (hr == S_OK) { ok(copy.vt == propvar.vt, "expected %d, got %d\n", propvar.vt, copy.vt); @@ -224,7 +229,7 @@ static void test_validtypes(void) ok(!ret || broken(ret) /* win2000 */, "%d: copy should stay unchanged\n", i); } hr = PropVariantClear(&propvar); - expect(hr, vt, FALSE); + expect(hr, vt, FALSE, __LINE__); 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); @@ -234,7 +239,7 @@ static void test_validtypes(void) vt = propvar.vt = i | VT_ARRAY; memset(©, 0x77, sizeof(copy)); hr = PropVariantCopy(©, &propvar); - expect(hr, vt, TRUE); + expect(hr, vt, TRUE, __LINE__); if (hr == S_OK) { ok(copy.vt == propvar.vt, "expected %d, got %d\n", propvar.vt, copy.vt); @@ -247,7 +252,7 @@ static void test_validtypes(void) ok(!ret || broken(ret) /* win2000 */, "%d: copy should stay unchanged\n", i); } hr = PropVariantClear(&propvar); - expect(hr, vt, FALSE); + expect(hr, vt, FALSE, __LINE__); 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); @@ -258,7 +263,7 @@ static void test_validtypes(void) vt = propvar.vt = i | VT_VECTOR; memset(©, 0x77, sizeof(copy)); hr = PropVariantCopy(©, &propvar); - expect(hr, vt, TRUE); + expect(hr, vt, TRUE, __LINE__); if (hr == S_OK) { ok(copy.vt == propvar.vt, "expected %d, got %d\n", propvar.vt, copy.vt); @@ -271,7 +276,7 @@ static void test_validtypes(void) ok(!ret || broken(ret) /* win2000 */, "%d: copy should stay unchanged\n", i); } hr = PropVariantClear(&propvar); - expect(hr, vt, FALSE); + expect(hr, vt, FALSE, __LINE__); 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); @@ -281,7 +286,7 @@ static void test_validtypes(void) vt = propvar.vt = i | VT_BYREF; memset(©, 0x77, sizeof(copy)); hr = PropVariantCopy(©, &propvar); - expect(hr, vt, TRUE); + expect(hr, vt, TRUE, __LINE__); if (hr == S_OK) { ok(copy.vt == propvar.vt, "expected %d, got %d\n", propvar.vt, copy.vt); @@ -295,7 +300,7 @@ static void test_validtypes(void) ok(!ret || broken(ret) /* win2000 */, "%d: copy should stay unchanged\n", i); } hr = PropVariantClear(&propvar); - expect(hr, vt, FALSE); + expect(hr, vt, FALSE, __LINE__); 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);
participants (1)
-
Alexandre Julliard