[PATCH 3/9] Fix reference leak in IImageList_Clone()

Nikolay Sivov nsivov at codeweavers.com
Sat Aug 21 10:17:34 CDT 2010


---
 dlls/comctl32/imagelist.c       |   13 +++++++++----
 dlls/comctl32/tests/imagelist.c |   15 +++++++++++++--
 2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 34cf7d3..7133d2f 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -3392,16 +3392,21 @@ static HRESULT WINAPI ImageListImpl_Merge(IImageList *iface, int i1,
 static HRESULT WINAPI ImageListImpl_Clone(IImageList *iface, REFIID riid, void **ppv)
 {
     HIMAGELIST This = (HIMAGELIST) iface;
-    HIMAGELIST hNew;
+    HIMAGELIST clone;
     HRESULT ret = E_FAIL;
 
     TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
 
-    hNew = ImageList_Duplicate(This);
+    clone = ImageList_Duplicate(This);
 
     /* Get the interface for the new image list */
-    if (hNew)
-        ret = HIMAGELIST_QueryInterface(hNew, riid, ppv);
+    if (clone)
+    {
+        IImageList *iclone = (IImageList*)clone;
+
+        ret = HIMAGELIST_QueryInterface(clone, riid, ppv);
+        IImageList_Release(iclone);
+    }
 
     return ret;
 }
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index a4dae03..210f9ec 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -1332,7 +1332,7 @@ cleanup:
 
 static void test_iimagelist(void)
 {
-    IImageList *imgl;
+    IImageList *imgl, *imgl2;
     HIMAGELIST himl;
     HRESULT hr;
     ULONG ret;
@@ -1364,6 +1364,15 @@ static void test_iimagelist(void)
     ret = ImageList_Destroy((HIMAGELIST)imgl);
     ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
 
+    /* ref counting, HIMAGELIST_QueryInterface adds a reference */
+    imgl = (IImageList*)createImageList(32, 32);
+    hr = pHIMAGELIST_QueryInterface((HIMAGELIST)imgl, &IID_IImageList, (void**)&imgl2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(imgl2 == imgl, "got different pointer\n");
+    ret = IImageList_Release(imgl);
+    ok(ret == 1, "got %u\n", ret);
+    IImageList_Release(imgl);
+
     if (!pImageList_CoCreateInstance)
     {
         win_skip("Vista imagelist functions not available\n");
@@ -1783,6 +1792,7 @@ static void test_IImageList_Clone(void)
     IImageList *imgl, *imgl2;
     HIMAGELIST himl;
     HRESULT hr;
+    ULONG ref;
 
     himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3);
     imgl = (IImageList*)himl;
@@ -1795,7 +1805,8 @@ if (0)
 
     hr = IImageList_Clone(imgl, &IID_IImageList, (void**)&imgl2);
     ok(hr == S_OK, "got 0x%08x\n", hr);
-    IImageList_Release(imgl2);
+    ref = IImageList_Release(imgl2);
+    ok(ref == 0, "got %u\n", ref);
 
     IImageList_Release(imgl);
 }
-- 
1.5.6.5



--------------000104010901000000030505--



More information about the wine-patches mailing list