Validate imagelists #3
Duane Clark
dclark at akamail.com
Wed Dec 25 14:51:04 CST 2002
Andreas Mohr wrote:
> On Tue, Dec 24, 2002 at 11:27:57AM -0800, Duane Clark wrote:
>>
>>+#define IMAGELIST_MAGIC 0x4C4D4948
>
> "HIML" ??
>
> Wouldn't that be more like 0x53414D58 ???
>
> Merry Christmas, BTW ! :-)
>
Good idea :-) That's the only difference between this and the previous
version.
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 25 Dec 2002 20:46:44 -0000
@@ -29,7 +29,7 @@
/* the ones with offsets at the end are the same as in Windows */
struct _IMAGELIST
{
- DWORD magic; /* 00: 'LMIH' */
+ DWORD magic; /* 00: 'SAMX' */
INT cCurImage; /* 04: ImageCount */
INT cMaxImage; /* 08: maximages */
DWORD x3;
@@ -52,6 +52,8 @@
UINT uBitsPixel;
INT nOvlIdx[15];
};
+
+#define IMAGELIST_MAGIC 0x53414D58
/* 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 25 Dec 2002 20:46:45 -0000
@@ -76,6 +76,11 @@
static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0, FALSE };
+static inline BOOL is_valid(HIMAGELIST himl)
+{
+ return himl && himl->magic == IMAGELIST_MAGIC;
+}
+
/*************************************************************************
* IMAGELIST_InternalExpandBitmaps [Internal]
@@ -171,7 +176,7 @@
HBITMAP hOldBitmapImage, hOldBitmap;
TRACE("himl=%p hbmimage=%p hbmmask=%p\n", himl, hbmImage, hbmMask);
- if (!himl || !hbmImage)
+ if (!is_valid(himl))
return -1;
GetObjectA (hbmImage, sizeof(BITMAP), (LPVOID)&bmp);
@@ -283,7 +288,7 @@
COLORREF bkColor;
TRACE("himl=%p hbitmap=%p clrmask=%lx\n", himl, hBitmap, clrMask);
- if (himl == NULL)
+ if (!is_valid(himl))
return -1;
if (!GetObjectA (hBitmap, sizeof(BITMAP), &bmp))
@@ -395,7 +400,7 @@
TRACE("(himlTrack=%p iTrack=%d dx=%d dy=%d)\n", himlTrack, iTrack,
dxHotspot, dyHotspot);
- if (himlTrack == NULL)
+ if (!is_valid(himlTrack))
return FALSE;
if (InternalDrag.himl)
@@ -467,7 +472,7 @@
TRACE("iDst=%d iSrc=%d\n", iDst, iSrc);
- if ((himlSrc == NULL) || (himlDst == NULL))
+ if (!is_valid(himlSrc) || !is_valid(himlDst))
return FALSE;
if ((iDst < 0) || (iDst >= himlDst->cCurImage))
return FALSE;
@@ -599,6 +604,7 @@
if (!himl)
return NULL;
+ himl->magic = IMAGELIST_MAGIC;
himl->cx = cx;
himl->cy = cy;
himl->flags = flags;
@@ -608,6 +614,10 @@
himl->cCurImage = 0;
himl->clrFg = CLR_DEFAULT;
himl->clrBk = CLR_NONE;
+ himl->hbmImage = 0;
+ himl->hbmMask = 0;
+ himl->hbrBlend25 = 0;
+ himl->hbrBlend50 = 0;
/* initialize overlay mask indices */
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
@@ -625,6 +635,7 @@
1, himl->uBitsPixel, NULL);
if (himl->hbmImage == 0) {
ERR("Error creating image bitmap!\n");
+ ImageList_Destroy(himl);
return NULL;
}
}
@@ -640,8 +651,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 +688,7 @@
BOOL WINAPI
ImageList_Destroy (HIMAGELIST himl)
{
- if (!himl)
+ if (!is_valid(himl))
return FALSE;
/* delete image bitmaps */
@@ -724,7 +734,7 @@
{
TRACE("(hwnd=%p x=%d y=%d)\n", hwndLock, x, y);
- if (InternalDrag.himl == NULL)
+ if (!is_valid(InternalDrag.himl))
return FALSE;
if (hwndLock)
@@ -846,9 +856,8 @@
{
TRACE("(x=%d y=%d)\n", x, y);
- if (!InternalDrag.himl) {
+ if (!is_valid(InternalDrag.himl))
return FALSE;
- }
/* draw/update the drag image */
if (InternalDrag.bShow) {
@@ -935,6 +944,9 @@
HDC hdcBg;
INT x, y;
+ if (!is_valid(InternalDrag.himl))
+ return FALSE;
+
TRACE("bShow=0x%X!\n", bShow);
/* DragImage is already visible/hidden */
@@ -1084,6 +1096,7 @@
HIMAGELIST himl;
if (!pimldp || !(himl = pimldp->himl)) return FALSE;
+ if (!is_valid(himl)) return FALSE;
if ((pimldp->i < 0) || (pimldp->i >= himl->cCurImage)) return FALSE;
lx = himl->cx * pimldp->i + pimldp->xBitmap;
@@ -1248,7 +1261,7 @@
HIMAGELIST himlDst;
HDC hdcSrc, hdcDst;
- if (himlSrc == NULL) {
+ if (!is_valid(himlSrc)) {
ERR("Invalid image list handle!\n");
return NULL;
}
@@ -1353,7 +1366,7 @@
HIMAGELIST WINAPI
ImageList_GetDragImage (POINT *ppt, POINT *pptHotspot)
{
- if (InternalDrag.himl) {
+ if (is_valid(InternalDrag.himl)) {
if (ppt) {
ppt->x = InternalDrag.x;
ppt->y = InternalDrag.y;
@@ -1407,7 +1420,7 @@
HBITMAP hOldDstBitmap;
HDC hdcDst;
- if ((himl == NULL) || (i < 0) || (i >= himl->cCurImage)) return 0;
+ if (!is_valid(himl) || (i < 0) || (i >= himl->cCurImage)) return NULL;
hdcDst = CreateCompatibleDC(0);
@@ -1461,7 +1474,7 @@
BOOL WINAPI
ImageList_GetIconSize (HIMAGELIST himl, INT *cx, INT *cy)
{
- if (himl == NULL)
+ if (!is_valid(himl))
return FALSE;
if ((himl->cx <= 0) || (himl->cy <= 0))
return FALSE;
@@ -1491,7 +1504,7 @@
INT WINAPI
ImageList_GetImageCount (HIMAGELIST himl)
{
- if (himl == NULL)
+ if (!is_valid(himl))
return 0;
return himl->cCurImage;
@@ -1516,7 +1529,7 @@
BOOL WINAPI
ImageList_GetImageInfo (HIMAGELIST himl, INT i, IMAGEINFO *pImageInfo)
{
- if ((himl == NULL) || (pImageInfo == NULL))
+ if (!is_valid(himl) || (pImageInfo == NULL))
return FALSE;
if ((i < 0) || (i >= himl->cCurImage))
return FALSE;
@@ -1554,7 +1567,7 @@
BOOL WINAPI
ImageList_GetImageRect (HIMAGELIST himl, INT i, LPRECT lpRect)
{
- if ((himl == NULL) || (lpRect == NULL))
+ if (!is_valid(himl) || (lpRect == NULL))
return FALSE;
if ((i < 0) || (i >= himl->cCurImage))
return FALSE;
@@ -1625,6 +1638,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 +1652,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 +1725,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 +1739,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 +1788,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 (!is_valid(himl1) || !is_valid(himl2))
return NULL;
/* check indices */
@@ -1802,6 +1835,8 @@
}
himlDst = ImageList_Create (cxDst, cyDst, ILC_MASK | ILC_COLOR, 1, 1);
+ if (!himlDst)
+ return NULL;
if (himlDst) {
hdcSrcImage = CreateCompatibleDC (0);
@@ -2072,7 +2107,7 @@
TRACE("(himl=%p i=%d)\n", himl, i);
- if (himl == NULL) {
+ if (!is_valid(himl)) {
ERR("Invalid image list handle!\n");
return FALSE;
}
@@ -2208,7 +2243,7 @@
TRACE("%p %d %p %p\n", himl, i, hbmImage, hbmMask);
- if (himl == NULL) {
+ if (!is_valid(himl)) {
ERR("Invalid image list handle!\n");
return FALSE;
}
@@ -2283,7 +2318,7 @@
TRACE("(0x%lx 0x%x %p)\n", (DWORD)himl, i, hIcon);
- if (himl == NULL)
+ if (!is_valid(himl))
return -1;
if ((i >= himl->cMaxImage) || (i < -1))
return -1;
@@ -2371,7 +2406,7 @@
{
COLORREF clrOldBk;
- if (himl == NULL)
+ if (!is_valid(himl))
return CLR_NONE;
clrOldBk = himl->clrBk;
@@ -2409,7 +2444,7 @@
INT dx, dy;
BOOL visible;
- if (InternalDrag.himl == NULL)
+ if (!is_valid(InternalDrag.himl) || !is_valid(himlDrag))
return FALSE;
TRACE(" dxH=%d dyH=%d nX=%d nY=%d\n",
@@ -2526,7 +2561,7 @@
{
INT nCount;
- if (!himl)
+ if (!is_valid(himl))
return FALSE;
/* remove all images */
@@ -2578,7 +2613,7 @@
TRACE("%p %d\n",himl,iImageCount);
- if (!himl)
+ if (!is_valid(himl))
return FALSE;
if (himl->cCurImage >= iImageCount)
return FALSE;
@@ -2672,7 +2707,7 @@
BOOL WINAPI
ImageList_SetOverlayImage (HIMAGELIST himl, INT iImage, INT iOverlay)
{
- if (!himl)
+ if (!is_valid(himl))
return FALSE;
if ((iOverlay < 1) || (iOverlay > MAX_OVERLAYIMAGE))
return FALSE;
@@ -2805,7 +2840,7 @@
ILHEAD ilHead;
int i;
- if (!himl)
+ if (!is_valid(himl))
return FALSE;
ilHead.usMagic = (('L' << 8) | 'I');
More information about the wine-patches
mailing list