Author: jgardou Date: Thu Oct 23 09:32:21 2014 New Revision: 64911
URL: http://svn.reactos.org/svn/reactos?rev=64911&view=rev Log: [USER32] - Fix LookupIconIdFromDirectoryEx, returning 0 when no matching entry is found. - Fix error handling when opening a cursor file. - Various code beautification here and there CORE-7575
Modified: trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c
Modified: trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/windows... ============================================================================== --- trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/windows/cursoricon_new.c [iso-8859-1] Thu Oct 23 09:32:21 2014 @@ -393,10 +393,11 @@ WORD i; const CURSORICONFILEDIRENTRY* entry;
+ /* Check our file is what it claims to be */ if ( dwFileSize < sizeof(*dir) ) return NULL;
- if ( dwFileSize < (sizeof(*dir) + sizeof(dir->idEntries[0])*(dir->idCount-1)) ) + if (dwFileSize < (sizeof(*dir) + FIELD_OFFSET(CURSORICONFILEDIR, idEntries[dir->idCount]))) return NULL;
/* @@ -418,7 +419,8 @@ fakeEntry = &fakeDir->idEntries[i]; entry = &dir->idEntries[i]; /* Take this as an occasion to perform a size check */ - if((entry->dwDIBOffset + entry->dwDIBSize) > dwFileSize) + if ((entry->dwDIBOffset > dwFileSize) + || ((entry->dwDIBOffset + entry->dwDIBSize) > dwFileSize)) { ERR("Corrupted icon file?.\n"); HeapFree(GetProcessHeap(), 0, fakeDir); @@ -1260,12 +1262,12 @@ cursorData.rt = (USHORT)((ULONG_PTR)(bIcon ? RT_ICON : RT_CURSOR));
/* Do the dance */ - if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)&bits[entry->dwDIBOffset])) + if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)(&bits[entry->dwDIBOffset]))) goto end;
hCurIcon = NtUserxCreateEmptyCurObject(FALSE); if(!hCurIcon) - goto end_error; + goto end;
/* Tell win32k */ if(!NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData)) @@ -1283,6 +1285,7 @@ DeleteObject(cursorData.hbmMask); if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + UnmapViewOfFile(bits);
return NULL; } @@ -2196,7 +2199,7 @@
/* No inferior or equal depth available. Get the smallest bigger one */ BitCount = 0xFFFF; - iIndex = 0; + iIndex = -1; for(i = 0; i < dir->idCount; i++) { entry = &dir->idEntries[i]; @@ -2222,8 +2225,10 @@ BitCount = entry->wBitCount; } } - - return dir->idEntries[iIndex].wResId; + if (iIndex >= 0) + return dir->idEntries[iIndex].wResId; + + return 0; }
HICON WINAPI CreateIcon(