Aric Stewart : comctl32: ILC_COLORDDB imagelists can be created with 0 sizes.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Nov 20 07:48:47 CST 2015


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Thu Nov 19 07:53:04 2015 -0600

comctl32: ILC_COLORDDB imagelists can be created with 0 sizes.

Negative values are still invalid.

Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/imagelist.c       |  5 ++---
 dlls/comctl32/tests/imagelist.c | 44 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 608ccc9..c34eb0a 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -776,7 +776,8 @@ ImageList_Create (INT cx, INT cy, UINT flags,
 
     TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow);
 
-    if (cx <= 0 || cy <= 0) return NULL;
+    if (cx < 0 || cy < 0) return NULL;
+    if (!((flags&ILC_COLORDDB) == ILC_COLORDDB) && (cx == 0 || cy == 0)) return NULL;
 
     /* Create the IImageList interface for the image list */
     if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl)))
@@ -1831,8 +1832,6 @@ ImageList_GetIconSize (HIMAGELIST himl, INT *cx, INT *cy)
 {
     if (!is_valid(himl) || !cx || !cy)
 	return FALSE;
-    if ((himl->cx <= 0) || (himl->cy <= 0))
-	return FALSE;
 
     *cx = himl->cx;
     *cy = himl->cy;
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index 9941667..7e029e0 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -1964,7 +1964,11 @@ static void test_iconsize(void)
 static void test_create_destroy(void)
 {
     HIMAGELIST himl;
+    IImageList *imgl;
+    INT cx, cy;
     BOOL rc;
+    HRESULT hr;
+    INT ret;
 
     /* list with zero or negative image dimensions */
     himl = ImageList_Create(0, 0, ILC_COLOR16, 0, 3);
@@ -1984,6 +1988,46 @@ static void test_create_destroy(void)
 
     rc = ImageList_Destroy((HIMAGELIST)0xdeadbeef);
     ok(rc == FALSE, "ImageList_Destroy(0xdeadbeef) should fail and not crash\n");
+
+    /* DDB image lists */
+    himl = ImageList_Create(0, 14, ILC_COLORDDB, 4, 4);
+    ok(himl != NULL, "got %p\n", himl);
+    imgl = (IImageList*)himl;
+    IImageList_GetIconSize(imgl, &cx, &cy);
+    ok (cx == 0, "Wrong cx (%i)\n", cx);
+    ok (cy == 14, "Wrong cy (%i)\n", cy);
+    ImageList_Destroy(himl);
+
+    himl = ImageList_Create(0, 0, ILC_COLORDDB, 4, 4);
+    ok(himl != NULL, "got %p\n", himl);
+    imgl = (IImageList*)himl;
+    IImageList_GetIconSize(imgl, &cx, &cy);
+    ok (cx == 0, "Wrong cx (%i)\n", cx);
+    ok (cy == 0, "Wrong cy (%i)\n", cy);
+    ImageList_Destroy(himl);
+
+    himl = ImageList_Create(0, 0, ILC_COLORDDB, 0, 4);
+    ok(himl != NULL, "got %p\n", himl);
+    imgl = (IImageList*)himl;
+    IImageList_GetIconSize(imgl, &cx, &cy);
+    ok (cx == 0, "Wrong cx (%i)\n", cx);
+    ok (cy == 0, "Wrong cy (%i)\n", cy);
+
+    hr = IImageList_SetImageCount(imgl, 3);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    hr = IImageList_GetImageCount(imgl, &ret);
+    ok(hr == S_OK && ret == 3, "invalid image count after increase\n");
+
+    /* Trying to actually add an image causes a crash on Windows */
+    ImageList_Destroy(himl);
+
+    /* Negative values fail */
+    himl = ImageList_Create(-1, -1, ILC_COLORDDB, 4, 4);
+    ok(himl == NULL, "got %p\n", himl);
+    himl = ImageList_Create(-1, 1, ILC_COLORDDB, 4, 4);
+    ok(himl == NULL, "got %p\n", himl);
+    himl = ImageList_Create(1, -1, ILC_COLORDDB, 4, 4);
+    ok(himl == NULL, "got %p\n", himl);
 }
 
 static void test_IImageList_Clone(void)




More information about the wine-cvs mailing list