Don't try reading a PIDL in IPersistStream->Load if its size is 0.
Check the number of bytes read was correct. Small reorganization of error handling.
This commit is contained in:
parent
9e4c409b7c
commit
03bbb46442
|
@ -870,48 +870,54 @@ static HRESULT WINAPI IPersistStream_fnLoad(
|
||||||
}
|
}
|
||||||
|
|
||||||
IStream_AddRef (pLoadStream);
|
IStream_AddRef (pLoadStream);
|
||||||
if(lpLinkHeader)
|
if(!lpLinkHeader)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
dwBytesRead = 0;
|
||||||
|
if (!(SUCCEEDED(IStream_Read(pLoadStream, lpLinkHeader, LINK_HEADER_SIZE, &dwBytesRead))))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if (dwBytesRead != LINK_HEADER_SIZE)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if ( (lpLinkHeader->MagicStr != 0x0000004CL) || !IsEqualIID(&lpLinkHeader->MagicGuid, &CLSID_ShellLink) )
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if(lpLinkHeader->PidlSize)
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(IStream_Read(pLoadStream, lpLinkHeader, LINK_HEADER_SIZE, &dwBytesRead)))
|
lpLinkHeader = HeapReAlloc(GetProcessHeap(), 0, lpLinkHeader, LINK_HEADER_SIZE+lpLinkHeader->PidlSize);
|
||||||
{
|
if (!lpLinkHeader)
|
||||||
if ((lpLinkHeader->MagicStr == 0x0000004CL) && IsEqualIID(&lpLinkHeader->MagicGuid, &CLSID_ShellLink))
|
goto end;
|
||||||
{
|
dwBytesRead = 0;
|
||||||
lpLinkHeader = HeapReAlloc(GetProcessHeap(), 0, lpLinkHeader, LINK_HEADER_SIZE+lpLinkHeader->PidlSize);
|
if (!(SUCCEEDED(IStream_Read(pLoadStream, &(lpLinkHeader->Pidl), lpLinkHeader->PidlSize, &dwBytesRead))))
|
||||||
if (lpLinkHeader)
|
goto end;
|
||||||
{
|
if(dwBytesRead != lpLinkHeader->PidlSize)
|
||||||
if (SUCCEEDED(IStream_Read(pLoadStream, &(lpLinkHeader->Pidl), lpLinkHeader->PidlSize, &dwBytesRead)))
|
goto end;
|
||||||
{
|
|
||||||
if (pcheck (&lpLinkHeader->Pidl))
|
|
||||||
{
|
|
||||||
This->pPidl = ILClone (&lpLinkHeader->Pidl);
|
|
||||||
|
|
||||||
SHGetPathFromIDListA(&lpLinkHeader->Pidl, sTemp);
|
if (pcheck (&lpLinkHeader->Pidl))
|
||||||
This->sPath = heap_strdup( sTemp );
|
{
|
||||||
}
|
This->pPidl = ILClone (&lpLinkHeader->Pidl);
|
||||||
This->wHotKey = lpLinkHeader->wHotKey;
|
|
||||||
FileTimeToSystemTime (&lpLinkHeader->Time1, &This->time1);
|
SHGetPathFromIDListA(&lpLinkHeader->Pidl, sTemp);
|
||||||
FileTimeToSystemTime (&lpLinkHeader->Time2, &This->time2);
|
This->sPath = heap_strdup( sTemp );
|
||||||
FileTimeToSystemTime (&lpLinkHeader->Time3, &This->time3);
|
}
|
||||||
|
}
|
||||||
|
This->wHotKey = lpLinkHeader->wHotKey;
|
||||||
|
FileTimeToSystemTime (&lpLinkHeader->Time1, &This->time1);
|
||||||
|
FileTimeToSystemTime (&lpLinkHeader->Time2, &This->time2);
|
||||||
|
FileTimeToSystemTime (&lpLinkHeader->Time3, &This->time3);
|
||||||
#if 1
|
#if 1
|
||||||
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time1, NULL, sTemp, 256);
|
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time1, NULL, sTemp, 256);
|
||||||
TRACE("-- time1: %s\n", sTemp);
|
TRACE("-- time1: %s\n", sTemp);
|
||||||
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time2, NULL, sTemp, 256);
|
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time2, NULL, sTemp, 256);
|
||||||
TRACE("-- time1: %s\n", sTemp);
|
TRACE("-- time1: %s\n", sTemp);
|
||||||
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time3, NULL, sTemp, 256);
|
GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time3, NULL, sTemp, 256);
|
||||||
TRACE("-- time1: %s\n", sTemp);
|
TRACE("-- time1: %s\n", sTemp);
|
||||||
pdump (This->pPidl);
|
pdump (This->pPidl);
|
||||||
#endif
|
#endif
|
||||||
ret = S_OK;
|
ret = S_OK;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WARN("stream contains no link!\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
end:
|
||||||
IStream_Release (pLoadStream);
|
IStream_Release (pLoadStream);
|
||||||
|
|
||||||
pdump(This->pPidl);
|
pdump(This->pPidl);
|
||||||
|
|
Loading…
Reference in New Issue