From 6db1d3c5b99b99ad10f3604ca2b87266b4aaa064 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 21 Aug 2010 19:17:34 +0400 Subject: [PATCH] comctl32/imagelist: Fix reference leak in IImageList_Clone(). --- 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 34cf7d349bd..7133d2fda09 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 a4dae0366e7..210f9ec0833 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); } -- 2.11.4.GIT