Andrew Nguyen : dxdiagn: Unconditionally initialize the passed variant in IDxDiagContainer::GetProp .

Alexandre Julliard julliard at winehq.org
Wed Jun 15 13:43:00 CDT 2011


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

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Wed Jun 15 07:10:32 2011 -0500

dxdiagn: Unconditionally initialize the passed variant in IDxDiagContainer::GetProp.

---

 dlls/dxdiagn/container.c       |    5 +----
 dlls/dxdiagn/tests/container.c |   16 +++++++++++++++-
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/dlls/dxdiagn/container.c b/dlls/dxdiagn/container.c
index 96ba10a..6de641f 100644
--- a/dlls/dxdiagn/container.c
+++ b/dlls/dxdiagn/container.c
@@ -222,10 +222,7 @@ static HRESULT WINAPI IDxDiagContainerImpl_GetProp(PDXDIAGCONTAINER iface, LPCWS
   LIST_FOR_EACH_ENTRY(p, &This->cont->properties, IDxDiagContainerImpl_Property, entry)
   {
     if (0 == lstrcmpW(p->propName, pwszPropName)) {
-      HRESULT hr = VariantClear(pvarProp);
-      if (hr == DISP_E_ARRAYISLOCKED || hr == DISP_E_BADVARTYPE)
-        VariantInit(pvarProp);
-
+      VariantInit(pvarProp);
       return VariantCopy(pvarProp, &p->vProp);
     }
   }
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c
index c7bd2bb..dff8701 100644
--- a/dlls/dxdiagn/tests/container.c
+++ b/dlls/dxdiagn/tests/container.c
@@ -568,6 +568,7 @@ static void test_GetProp(void)
     VARIANT var;
     SAFEARRAY *sa;
     SAFEARRAYBOUND bound;
+    ULONG ref;
     static const WCHAR emptyW[] = {0};
     static const WCHAR testW[] = {'t','e','s','t',0};
 
@@ -680,8 +681,21 @@ static void test_GetProp(void)
     ok(hr == S_OK, "Expected SafeArrayUnlock to return S_OK, got 0x%08x\n", hr);
     hr = SafeArrayDestroy(sa);
     ok(hr == S_OK, "Expected SafeArrayDestroy to return S_OK, got 0x%08x\n", hr);
-    IDxDiagContainer_Release(child);
 
+    /* Determine whether GetProp calls VariantClear on the passed variant. */
+    V_VT(&var) = VT_UNKNOWN;
+    V_UNKNOWN(&var) = (IUnknown *)child;
+    IDxDiagContainer_AddRef(child);
+
+    hr = IDxDiagContainer_GetProp(child, property, &var);
+    ok(hr == S_OK, "Expected IDxDiagContainer::GetProp to return S_OK, got 0x%08x\n", hr);
+    ok(V_VT(&var) != VT_UNKNOWN, "Expected the variant to be modified\n");
+
+    IDxDiagContainer_AddRef(child);
+    ref = IDxDiagContainer_Release(child);
+    ok(ref == 2, "Expected reference count to be 2, got %u\n", ref);
+
+    IDxDiagContainer_Release(child);
 cleanup:
     IDxDiagContainer_Release(pddc);
     IDxDiagProvider_Release(pddp);




More information about the wine-cvs mailing list