Validate imagelists

Duane Clark dclark at akamail.com
Tue Dec 24 13:27:57 CST 2002


Changelog:
	Validate imagelists with christmas magic.

-------------- next part --------------
Index: dlls/comctl32/imagelist.h
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/imagelist.h,v
retrieving revision 1.3
diff -u -r1.3 imagelist.h
--- dlls/comctl32/imagelist.h	31 May 2002 23:25:44 -0000	1.3
+++ dlls/comctl32/imagelist.h	24 Dec 2002 19:26:09 -0000
@@ -53,6 +53,8 @@
     INT     nOvlIdx[15];
 };
 
+#define IMAGELIST_MAGIC 0x4C4D4948
+
 /* Header used by ImageList_Read() and ImageList_Write() */
 typedef struct _ILHEAD
 {
Index: dlls/comctl32/imagelist.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/imagelist.c,v
retrieving revision 1.68
diff -u -r1.68 imagelist.c
--- dlls/comctl32/imagelist.c	5 Dec 2002 20:33:09 -0000	1.68
+++ dlls/comctl32/imagelist.c	24 Dec 2002 19:26:11 -0000
@@ -171,7 +171,7 @@
     HBITMAP hOldBitmapImage, hOldBitmap;
 
     TRACE("himl=%p hbmimage=%p hbmmask=%p\n", himl, hbmImage, hbmMask);
-    if (!himl || !hbmImage)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC || !hbmImage)
         return -1;
 
     GetObjectA (hbmImage, sizeof(BITMAP), (LPVOID)&bmp);
@@ -283,7 +283,7 @@
     COLORREF bkColor;
 
     TRACE("himl=%p hbitmap=%p clrmask=%lx\n", himl, hBitmap, clrMask);
-    if (himl == NULL)
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC)
         return -1;
 
     if (!GetObjectA (hBitmap, sizeof(BITMAP), &bmp))
@@ -599,6 +599,7 @@
     if (!himl)
         return NULL;
 
+    himl->magic     = IMAGELIST_MAGIC;
     himl->cx        = cx;
     himl->cy        = cy;
     himl->flags     = flags;
@@ -625,6 +626,7 @@
                         1, himl->uBitsPixel, NULL);
 	if (himl->hbmImage == 0) {
 	    ERR("Error creating image bitmap!\n");
+	    ImageList_Destroy(himl);
 	    return NULL;
 	}
     }
@@ -640,8 +642,7 @@
 					1, 1, NULL);
         if (himl->hbmMask == 0) {
             ERR("Error creating mask bitmap!\n");
-            if (himl->hbmImage)
-                DeleteObject (himl->hbmImage);
+            ImageList_Destroy(himl);
             return NULL;
         }
     }
@@ -678,7 +679,7 @@
 BOOL WINAPI
 ImageList_Destroy (HIMAGELIST himl)
 {
-    if (!himl)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
 
     /* delete image bitmaps */
@@ -1248,7 +1249,7 @@
     HIMAGELIST himlDst;
     HDC hdcSrc, hdcDst;
 
-    if (himlSrc == NULL) {
+    if (himlSrc == NULL || himlSrc->magic!=IMAGELIST_MAGIC) {
         ERR("Invalid image list handle!\n");
         return NULL;
     }
@@ -1407,7 +1408,7 @@
     HBITMAP hOldDstBitmap;
     HDC hdcDst;
 
-    if ((himl == NULL) || (i < 0) || (i >= himl->cCurImage)) return 0;
+    if ((himl == NULL) || himl->magic!=IMAGELIST_MAGIC || (i < 0) || (i >= himl->cCurImage)) return 0;
 
     hdcDst = CreateCompatibleDC(0);
 
@@ -1461,7 +1462,7 @@
 BOOL WINAPI
 ImageList_GetIconSize (HIMAGELIST himl, INT *cx, INT *cy)
 {
-    if (himl == NULL)
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
     if ((himl->cx <= 0) || (himl->cy <= 0))
 	return FALSE;
@@ -1491,7 +1492,7 @@
 INT WINAPI
 ImageList_GetImageCount (HIMAGELIST himl)
 {
-    if (himl == NULL)
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC)
 	return 0;
 
     return himl->cCurImage;
@@ -1516,7 +1517,7 @@
 BOOL WINAPI
 ImageList_GetImageInfo (HIMAGELIST himl, INT i, IMAGEINFO *pImageInfo)
 {
-    if ((himl == NULL) || (pImageInfo == NULL))
+    if ((himl == NULL) || himl->magic!=IMAGELIST_MAGIC || (pImageInfo == NULL))
 	return FALSE;
     if ((i < 0) || (i >= himl->cCurImage))
 	return FALSE;
@@ -1554,7 +1555,7 @@
 BOOL WINAPI
 ImageList_GetImageRect (HIMAGELIST himl, INT i, LPRECT lpRect)
 {
-    if ((himl == NULL) || (lpRect == NULL))
+    if ((himl == NULL) || himl->magic!=IMAGELIST_MAGIC || (lpRect == NULL))
 	return FALSE;
     if ((i < 0) || (i >= himl->cCurImage))
 	return FALSE;
@@ -1625,6 +1626,10 @@
 
         himl = ImageList_Create (cx, bmp.bmHeight, ILC_MASK | ILC_COLOR,
                                  nImageCount, cGrow);
+        if (!himl) {
+            DeleteObject (handle);
+            return NULL;
+        }
         ImageList_AddMasked (himl, (HBITMAP)handle, clrMask);
     }
     else if ((uType == IMAGE_ICON) || (uType == IMAGE_CURSOR)) {
@@ -1635,6 +1640,12 @@
         GetObjectA (ii.hbmColor, sizeof(BITMAP), (LPVOID)&bmp);
         himl = ImageList_Create (bmp.bmWidth, bmp.bmHeight,
                                  ILC_MASK | ILC_COLOR, 1, cGrow);
+        if (!himl) {
+            DeleteObject (ii.hbmColor);
+            DeleteObject (ii.hbmMask);
+            DeleteObject (handle);
+            return NULL;
+        }
         ImageList_Add (himl, ii.hbmColor, ii.hbmMask);
         DeleteObject (ii.hbmColor);
         DeleteObject (ii.hbmMask);
@@ -1702,6 +1713,10 @@
 
         himl = ImageList_Create (cx, bmp.bmHeight, ILC_MASK | ILC_COLOR,
                                  nImageCount, cGrow);
+        if (!himl) {
+            DeleteObject (handle);
+            return NULL;
+        }
         ImageList_AddMasked (himl, (HBITMAP)handle, clrMask);
     }
     else if ((uType == IMAGE_ICON) || (uType == IMAGE_CURSOR)) {
@@ -1712,6 +1727,12 @@
         GetObjectA (ii.hbmMask, sizeof(BITMAP), (LPVOID)&bmp);
         himl = ImageList_Create (bmp.bmWidth, bmp.bmHeight,
                                  ILC_MASK | ILC_COLOR, 1, cGrow);
+        if (!himl) {
+            DeleteObject (ii.hbmColor);
+            DeleteObject (ii.hbmMask);
+            DeleteObject (handle);
+            return NULL;
+        }
         ImageList_Add (himl, ii.hbmColor, ii.hbmMask);
         DeleteObject (ii.hbmColor);
         DeleteObject (ii.hbmMask);
@@ -1755,7 +1776,7 @@
     TRACE("(himl1=%p i1=%d himl2=%p i2=%d dx=%d dy=%d)\n", himl1, i1, himl2,
 	   i2, dx, dy);
 
-    if ((himl1 == NULL) || (himl2 == NULL))
+    if ((himl1 == NULL) || himl1->magic!=IMAGELIST_MAGIC || (himl2 == NULL) || himl2->magic!=IMAGELIST_MAGIC)
 	return NULL;
 
     /* check indices */
@@ -1802,6 +1823,8 @@
     }
 
     himlDst = ImageList_Create (cxDst, cyDst, ILC_MASK | ILC_COLOR, 1, 1);
+    if (!himlDst)
+        return NULL;
 
     if (himlDst) {
         hdcSrcImage = CreateCompatibleDC (0);
@@ -2072,7 +2095,7 @@
 
     TRACE("(himl=%p i=%d)\n", himl, i);
 
-    if (himl == NULL) {
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC) {
         ERR("Invalid image list handle!\n");
         return FALSE;
     }
@@ -2208,7 +2231,7 @@
 
     TRACE("%p %d %p %p\n", himl, i, hbmImage, hbmMask);
 
-    if (himl == NULL) {
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC) {
         ERR("Invalid image list handle!\n");
         return FALSE;
     }
@@ -2283,7 +2306,7 @@
 
     TRACE("(0x%lx 0x%x %p)\n", (DWORD)himl, i, hIcon);
 
-    if (himl == NULL)
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC)
 	return -1;
     if ((i >= himl->cMaxImage) || (i < -1))
 	return -1;
@@ -2371,7 +2394,7 @@
 {
     COLORREF clrOldBk;
 
-    if (himl == NULL)
+    if (himl == NULL || himl->magic!=IMAGELIST_MAGIC)
 	return CLR_NONE;
 
     clrOldBk = himl->clrBk;
@@ -2409,7 +2432,7 @@
     INT dx, dy;
     BOOL visible;
 
-    if (InternalDrag.himl == NULL)
+    if (InternalDrag.himl == NULL || InternalDrag.himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
 
     TRACE(" dxH=%d dyH=%d nX=%d nY=%d\n",
@@ -2526,7 +2549,7 @@
 {
     INT nCount;
 
-    if (!himl)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
 
     /* remove all images */
@@ -2578,7 +2601,7 @@
 
     TRACE("%p %d\n",himl,iImageCount);
 
-    if (!himl)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
     if (himl->cCurImage >= iImageCount)
 	return FALSE;
@@ -2672,7 +2695,7 @@
 BOOL WINAPI
 ImageList_SetOverlayImage (HIMAGELIST himl, INT iImage, INT iOverlay)
 {
-    if (!himl)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
     if ((iOverlay < 1) || (iOverlay > MAX_OVERLAYIMAGE))
 	return FALSE;
@@ -2805,7 +2828,7 @@
     ILHEAD ilHead;
     int i;
 
-    if (!himl)
+    if (!himl || himl->magic!=IMAGELIST_MAGIC)
 	return FALSE;
 
     ilHead.usMagic   = (('L' << 8) | 'I');


More information about the wine-patches mailing list