Aric Stewart : ole32: Not all uses of StorageImpl_ReadBigBlock fail if no bytes are read.
Alexandre Julliard
julliard at winehq.org
Wed Jun 12 15:37:24 CDT 2013
Module: wine
Branch: master
Commit: b69d67f146ee46604669348d17d52877b6052772
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b69d67f146ee46604669348d17d52877b6052772
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Jun 10 14:24:13 2013 -0500
ole32: Not all uses of StorageImpl_ReadBigBlock fail if no bytes are read.
---
dlls/ole32/storage32.c | 34 +++++++++++++++++++---------------
1 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 425fd12..5009127 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -105,7 +105,7 @@ static StorageInternalImpl* StorageInternalImpl_Construct(StorageBaseImpl* paren
static void StorageImpl_Destroy(StorageBaseImpl* iface);
static void StorageImpl_Invalidate(StorageBaseImpl* iface);
static HRESULT StorageImpl_Flush(StorageBaseImpl* iface);
-static BOOL StorageImpl_ReadBigBlock(StorageImpl* This, ULONG blockIndex, void* buffer);
+static HRESULT StorageImpl_ReadBigBlock(StorageImpl* This, ULONG blockIndex, void* buffer, ULONG *read );
static BOOL StorageImpl_WriteBigBlock(StorageImpl* This, ULONG blockIndex, const void* buffer);
static void StorageImpl_SetNextBlockInChain(StorageImpl* This, ULONG blockIndex, ULONG nextBlock);
static HRESULT StorageImpl_LoadFileHeader(StorageImpl* This);
@@ -3080,12 +3080,12 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
{
ULONG depotBlockIndexPos;
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
- BOOL success;
ULONG depotBlockOffset;
ULONG blocksPerDepot = This->bigBlockSize / sizeof(ULONG);
ULONG nextBlockIndex = BLOCK_SPECIAL;
int depotIndex = 0;
ULONG freeBlock = BLOCK_UNUSED;
+ ULONG read;
ULARGE_INTEGER neededSize;
STATSTG statstg;
@@ -3175,9 +3175,9 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
}
}
- success = StorageImpl_ReadBigBlock(This, depotBlockIndexPos, depotBuffer);
+ StorageImpl_ReadBigBlock(This, depotBlockIndexPos, depotBuffer, &read);
- if (success)
+ if (read)
{
while ( ( (depotBlockOffset/sizeof(ULONG) ) < blocksPerDepot) &&
( nextBlockIndex != BLOCK_UNUSED))
@@ -3257,7 +3257,7 @@ static ULONG Storage32Impl_GetExtDepotBlock(StorageImpl* This, ULONG depotIndex)
{
extBlockIndex = This->extBigBlockDepotLocations[extBlockCount];
- StorageImpl_ReadBigBlock(This, extBlockIndex, depotBuffer);
+ StorageImpl_ReadBigBlock(This, extBlockIndex, depotBuffer, NULL);
num_blocks = This->bigBlockSize / 4;
@@ -3419,7 +3419,7 @@ static HRESULT StorageImpl_GetNextBlockInChain(
ULONG depotBlockCount = offsetInDepot / This->bigBlockSize;
ULONG depotBlockOffset = offsetInDepot % This->bigBlockSize;
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
- BOOL success;
+ ULONG read;
ULONG depotBlockIndexPos;
int index, num_blocks;
@@ -3451,9 +3451,9 @@ static HRESULT StorageImpl_GetNextBlockInChain(
depotBlockIndexPos = Storage32Impl_GetExtDepotBlock(This, depotBlockCount);
}
- success = StorageImpl_ReadBigBlock(This, depotBlockIndexPos, depotBuffer);
+ StorageImpl_ReadBigBlock(This, depotBlockIndexPos, depotBuffer, &read);
- if (!success)
+ if (!read)
return STG_E_READFAULT;
num_blocks = This->bigBlockSize / 4;
@@ -4035,26 +4035,30 @@ HRESULT StorageImpl_WriteDirEntry(
return StorageImpl_WriteRawDirEntry(This, index, currentEntry);
}
-static BOOL StorageImpl_ReadBigBlock(
+static HRESULT StorageImpl_ReadBigBlock(
StorageImpl* This,
ULONG blockIndex,
- void* buffer)
+ void* buffer,
+ ULONG* out_read)
{
ULARGE_INTEGER ulOffset;
DWORD read=0;
+ HRESULT hr;
ulOffset.u.HighPart = 0;
ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
- StorageImpl_ReadAt(This, ulOffset, buffer, This->bigBlockSize, &read);
+ hr = StorageImpl_ReadAt(This, ulOffset, buffer, This->bigBlockSize, &read);
- if (read && read < This->bigBlockSize)
+ if (SUCCEEDED(hr) && read < This->bigBlockSize)
{
/* File ends during this block; fill the rest with 0's. */
memset((LPBYTE)buffer+read, 0, This->bigBlockSize-read);
}
- return (read != 0);
+ if (out_read) *out_read = read;
+
+ return hr;
}
static BOOL StorageImpl_ReadDWordFromBigBlock(
@@ -6222,7 +6226,7 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
{
if (!cachedBlock->read)
{
- if (!StorageImpl_ReadBigBlock(This->parentStorage, cachedBlock->sector, cachedBlock->data))
+ if (FAILED(StorageImpl_ReadBigBlock(This->parentStorage, cachedBlock->sector, cachedBlock->data, NULL)))
return STG_E_READFAULT;
cachedBlock->read = 1;
@@ -6306,7 +6310,7 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
{
if (!cachedBlock->read && bytesToWrite != This->parentStorage->bigBlockSize)
{
- if (!StorageImpl_ReadBigBlock(This->parentStorage, cachedBlock->sector, cachedBlock->data))
+ if (FAILED(StorageImpl_ReadBigBlock(This->parentStorage, cachedBlock->sector, cachedBlock->data, NULL)))
return STG_E_READFAULT;
}
More information about the wine-cvs
mailing list