Sync to Wine-0_9_5: Robert Shearman rob@codeweavers.com - ole: Fix mis-handling of return value in StgStreamImpl_Read. BlockChainStream_ReadAt returns a BOOL, not an HRESULT so change StgStreamImpl_Read to handle this, by returning STG_E_READFAULT on failure. - ole: Check the return value of IStream_SetSize in IStream_Read. Check the return value of IStream_SetSize in IStream_Read, since otherwise execution could continue on and cause heap corruption. Modified: trunk/reactos/lib/ole32/hglobalstream.c Modified: trunk/reactos/lib/ole32/stg_stream.c _____
Modified: trunk/reactos/lib/ole32/hglobalstream.c --- trunk/reactos/lib/ole32/hglobalstream.c 2006-01-06 20:14:15 UTC (rev 20620) +++ trunk/reactos/lib/ole32/hglobalstream.c 2006-01-06 20:19:21 UTC (rev 20621) @@ -313,7 +313,12 @@
if (newSize.u.LowPart > This->streamSize.u.LowPart) { /* grow stream */ - IStream_SetSize(iface, newSize); + HRESULT hr = IStream_SetSize(iface, newSize); + if (FAILED(hr)) + { + ERR("IStream_SetSize failed with error 0x%08lx\n", hr); + return hr; + } }
/* _____
Modified: trunk/reactos/lib/ole32/stg_stream.c --- trunk/reactos/lib/ole32/stg_stream.c 2006-01-06 20:14:15 UTC (rev 20620) +++ trunk/reactos/lib/ole32/stg_stream.c 2006-01-06 20:19:21 UTC (rev 20621) @@ -249,7 +249,7 @@
ULONG bytesReadBuffer; ULONG bytesToReadFromBuffer; - HRESULT res = S_FALSE; + HRESULT res;
TRACE("(%p, %p, %ld, %p)\n", iface, pv, cb, pcbRead); @@ -282,11 +282,15 @@ } else if (This->bigBlockChain!=0) { - res = BlockChainStream_ReadAt(This->bigBlockChain, - This->currentPosition, - bytesToReadFromBuffer, - pv, - pcbRead); + BOOL success = BlockChainStream_ReadAt(This->bigBlockChain, + This->currentPosition, + bytesToReadFromBuffer, + pv, + pcbRead); + if (success) + res = S_OK; + else + res = STG_E_READFAULT; } else {