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:
Mike McCormack 2002-08-16 23:27:07 +00:00 committed by Alexandre Julliard
parent 9e4c409b7c
commit 03bbb46442
1 changed files with 43 additions and 37 deletions

View File

@ -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);