diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c index b617510..7a75d10 100644 --- a/programs/winemenubuilder/winemenubuilder.c +++ b/programs/winemenubuilder/winemenubuilder.c @@ -612,6 +612,13 @@ static int populate_module_icons(HMODULE hModule, GRPICONDIR *grpIconDir, ICONDI if ((hResData = LoadResource(hModule, hResInfo))) { BITMAPINFO *pIcon; + DWORD availableBytes = ((IMAGE_RESOURCE_DATA_ENTRY *)hResInfo)->Size; + DWORD iconBytes = grpIconDir->idEntries[i].dwBytesInRes; + if (iconBytes > availableBytes) + { + WINE_ERR("Broken GRPICONENTRY tries to use %d bytes when only %d available, clipping\n", iconBytes, availableBytes); + iconBytes = availableBytes; + } if ((pIcon = LockResource(hResData))) { iconDirEntries[validEntries].bWidth = grpIconDir->idEntries[i].bWidth; @@ -620,11 +627,11 @@ static int populate_module_icons(HMODULE hModule, GRPICONDIR *grpIconDir, ICONDI iconDirEntries[validEntries].bReserved = grpIconDir->idEntries[i].bReserved; iconDirEntries[validEntries].wPlanes = grpIconDir->idEntries[i].wPlanes; iconDirEntries[validEntries].wBitCount = grpIconDir->idEntries[i].wBitCount; - iconDirEntries[validEntries].dwBytesInRes = grpIconDir->idEntries[i].dwBytesInRes; + iconDirEntries[validEntries].dwBytesInRes = iconBytes; iconDirEntries[validEntries].dwImageOffset = *iconOffset; validEntries++; - memcpy(&icons[*iconOffset], pIcon, grpIconDir->idEntries[i].dwBytesInRes); - *iconOffset += grpIconDir->idEntries[i].dwBytesInRes; + memcpy(&icons[*iconOffset], pIcon, iconBytes); + *iconOffset += iconBytes; } FreeResource(hResData); }