Sergio Gómez Del Real <sdelreal(a)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. -- Dmitry.