Bug in ICO_ExtractIconExW
Gerard Patel
gerard.patel at nerim.net
Sun Feb 17 10:12:00 CST 2002
At 03:01 PM 2/17/02 +0100, you wrote:
>Hi,
>
>I have a systematic crash when browsing a folder which has a *.gz file
>inside (for example using GetOpenFileName).
<snip>
>=>0 0x4082ba06 (ICO_ExtractIconExW+0x386(lpszExeFileName=0x403c4558,
>RetPtr=0x405c59a8, nIconIndex=0xffffff69, nIcons=0x1, cxDesired=0x20,
>cyDesired=0x20) [exticon.c:325] in libuser32.so) (ebp=405c5910)
> 1 0x4082c1c5 (PrivateExtractIconsW+0xf5(lpwstrFile=0x403c4558,
>nIndex=0xffffff69, sizeX=0x20, sizeY=0x20, phicon=0x405c59a8, w=0x0,
>nIcons=0x1, y=0x0) [exticon.c:555] in libuser32.so) (ebp=405c5948)
> 2 0x4082c251 (PrivateExtractIconsA+0x71(lpstrFile=0x405c5a20,
>nIndex=0xffffff69, sizeX=0x20, sizeY=0x20, phicon=0x405c59a8, w=0x0,
>nIcons=0x1, y=0x0) [exticon.c:578] in libuser32.so) (ebp=405c597c)
> 3 0x4065ed8d (SIC_LoadIcon+0x3d(sSourceFile=0x405c5a20,
>dwSourceIndex=0xffffff69) [iconcache.c:115] in libshell32.so) (ebp=405c59b8)
> 4 0x4065eeb9 (SIC_GetIconIndex+0xb9(sSourceFile=0x405c5a20,
>dwSourceIndex=0xffffff69) [iconcache.c:154] in libshell32.so) (ebp=405c5a00)
> 5 0x4065f32c (PidlToSicIndex+0xcc(sh=0x403c48f4, pidl=0x403b6cb0,
>bBigIcon=0x0, uFlags=0x0, pIndex=0x405c5b58) [iconcache.c:311] in
>libshell32.so) (ebp=405c5b3c)
Well, this value of 0xffffff69 is suspicious.
I think that this code may be too optimist :
BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
{
HKEY hkey;
char sTemp[MAX_PATH];
char sNum[5];
DWORD dwType;
BOOL ret = FALSE;
TRACE("%s\n",szClass );
sprintf(sTemp, "%s\\DefaultIcon",szClass);
if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
{
if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len))
{
if (dwType == REG_EXPAND_SZ)
{
ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
strcpy(szDest, sTemp);
}
if (ParseFieldA (szDest, 2, sNum, 5)) *dwNr=atoi(sNum);
ParseFieldA (szDest, 1, szDest, len);
ret = TRUE;
}
RegCloseKey(hkey);
}
TRACE("-- %s %li\n", szDest, *dwNr );
return ret;
}
in this case, maybe you could try something like :
if (ParseFieldA(szDest, 2, sNum, 5))
*dwNr = atoi(sNum);
else
*dwNr = 0;
I'm not sure it's correct, since it would mean that Wine
would always search for the icon 0 in the file. As I don't
know what is the exact meaning of the icon number in
the registry, I can't say more. However, it *should* not
crash anymore (if I'm right) as at least dwNr would be
initialized.
Gerard
More information about the wine-devel
mailing list