Sync to Wine-0_9_5:
Robert Shearman <rob(a)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
{