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/cursoricon_new.c?rev=64911&r1=64910&r2=64911&view=diff
==============================================================================
--- 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(


Reply via email to