Check for failed allocations and fix some resource leaks. Modified: trunk/reactos/lib/user32/windows/bitmap.c _____
Modified: trunk/reactos/lib/user32/windows/bitmap.c --- trunk/reactos/lib/user32/windows/bitmap.c 2005-12-12 20:41:27 UTC (rev 20116) +++ trunk/reactos/lib/user32/windows/bitmap.c 2005-12-12 20:46:26 UTC (rev 20117) @@ -176,12 +176,18 @@
IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0); CloseHandle(hSection); - if (IconDIR == NULL || 0 != IconDIR->idReserved - || (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) + if (IconDIR == NULL) { return NULL; }
+ if (0 != IconDIR->idReserved || + (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) + { + UnmapViewOfFile(IconDIR); + return NULL; + } + /* * Get a handle to the screen dc, the icon we create is going to be * compatable with it. @@ -213,11 +219,17 @@ if (!dirEntry) { UnmapViewOfFile(IconDIR); - return(NULL); + return NULL; }
SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes); + if (SafeIconImage == NULL) + { + UnmapViewOfFile(IconDIR); + return NULL; + } memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); + UnmapViewOfFile(IconDIR);
/* at this point we have a copy of the icon image to play with */
@@ -351,9 +363,9 @@ 0, NULL); if (hFile == NULL) - { - return(NULL); - } + { + return NULL; + }
hSection = CreateFileMappingW(hFile, NULL, @@ -362,43 +374,42 @@ 0, NULL);
+ CloseHandle(hFile); if (hSection == NULL) - { - CloseHandle(hFile); - return(NULL); - } + { + return NULL; + } + IconDIR = MapViewOfFile(hSection, FILE_MAP_READ, 0, 0, 0); + CloseHandle(hSection); + if (IconDIR == NULL) + { + return NULL; + } + + if (0 != IconDIR->idReserved || + (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) + { + UnmapViewOfFile(IconDIR); + return NULL; + }
- if (IconDIR == NULL || 0 != IconDIR->idReserved - || (IMAGE_ICON != IconDIR->idType && IMAGE_CURSOR != IconDIR->idType)) - { - CloseHandle(hFile); - CloseHandle(hSection); - return(NULL); - } - //pick the best size. dirEntry = (CURSORICONDIRENTRY *) CURSORICON_FindBestIcon( IconDIR, width, height, 1); - - if (!dirEntry) - { - CloseHandle(hFile); - CloseHandle(hSection); - UnmapViewOfFile(IconDIR); - return(NULL); - } + { + UnmapViewOfFile(IconDIR); + return NULL; + }
SafeIconImage = RtlAllocateHeap(GetProcessHeap(), 0, dirEntry->dwBytesInRes);
memcpy(SafeIconImage, ((PBYTE)IconDIR) + dirEntry->dwImageOffset, dirEntry->dwBytesInRes); - - CloseHandle(hFile); - CloseHandle(hSection); + UnmapViewOfFile(IconDIR); }
//at this point we have a copy of the icon image to play with @@ -430,10 +441,9 @@ if (hScreenDc == NULL) { if (fuLoad & LR_LOADFROMFILE) - { - RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); - UnmapViewOfFile(IconDIR); - } + { + RtlFreeHeap(GetProcessHeap(), 0, SafeIconImage); + } return(NULL); }
@@ -684,6 +694,11 @@ if ((res = CreateBitmapIndirect(&bm))) { char *buf = HeapAlloc(GetProcessHeap(), 0, bm.bmWidthBytes * bm.bmHeight); + if (buf == NULL) + { + DeleteObject(res); + return NULL; + } GetBitmapBits(hnd, bm.bmWidthBytes * bm.bmHeight, buf); SetBitmapBits(res, bm.bmWidthBytes * bm.bmHeight, buf); HeapFree(GetProcessHeap(), 0, buf);