Sergio Gómez Del Real sdelreal@codeweavers.com wrote:
- if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
- {
hr = read_clipformat( stm, &cf );
if (FAILED( hr )) return hr;
hr = IStream_Read( stm, &pres, sizeof(pres), &read );
if (FAILED( hr ) || read != sizeof(pres)) return E_FAIL;
- }
- else
- {
hr = IStream_Read( stm, &file, sizeof(BITMAPFILEHEADER), &read );
if (FAILED( hr ) || read != sizeof(BITMAPFILEHEADER)) return E_FAIL;
- }
Checking for S_OK in all tests above should be enough. That also should help with deciding a return value on failure.
hr = IStream_Seek( stm, offset_zero, STREAM_SEEK_CUR, ¤t_pos );
if (FAILED( hr )) return hr;
stat.cbSize.QuadPart -= current_pos.QuadPart;
hglobal = GlobalAlloc( GMEM_MOVEABLE, stat.cbSize.u.LowPart ); if (!hglobal) return E_OUTOFMEMORY; dib = GlobalLock( hglobal );
/* read first DWORD of BITMAPINFOHEADER */ hr = IStream_Read( stm, dib, sizeof(DWORD), &read ); if (hr != S_OK || read != sizeof(DWORD)) goto fail;
While you are at it the check above could also be simplified.
bi_size = *(DWORD *)dib; if (stat.cbSize.QuadPart < bi_size) goto fail;
- hr = IStream_Read( stm, (char *)dib + sizeof(DWORD), bi_size - sizeof(DWORD), &read );
- /* read rest of BITMAPINFOHEADER */
- hr = IStream_Read( stm, dib + sizeof(DWORD), bi_size - sizeof(DWORD), &read ); if (hr != S_OK || read != bi_size - sizeof(DWORD)) goto fail;
Same here.
- info_size = bitmap_info_size( dib, DIB_RGB_COLORS );
- info_size = bitmap_info_size( (BITMAPINFO *)dib, DIB_RGB_COLORS ); if (stat.cbSize.QuadPart < info_size) goto fail; if (info_size > bi_size) {
hr = IStream_Read( stm, (char *)dib + bi_size, info_size - bi_size, &read );
hr = IStream_Read( stm, dib + bi_size, info_size - bi_size, &read ); if (hr != S_OK || read != info_size - bi_size) goto fail;
Here, and other similar places.