ole32: Not all uses of StorageImpl_ReadBigBlock fail if no bytes are read.
This commit is contained in:
parent
66414c46c9
commit
b69d67f146
|
@ -105,7 +105,7 @@ static StorageInternalImpl* StorageInternalImpl_Construct(StorageBaseImpl* paren
|
||||||
static void StorageImpl_Destroy(StorageBaseImpl* iface);
|
static void StorageImpl_Destroy(StorageBaseImpl* iface);
|
||||||
static void StorageImpl_Invalidate(StorageBaseImpl* iface);
|
static void StorageImpl_Invalidate(StorageBaseImpl* iface);
|
||||||
static HRESULT StorageImpl_Flush(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 BOOL StorageImpl_WriteBigBlock(StorageImpl* This, ULONG blockIndex, const void* buffer);
|
||||||
static void StorageImpl_SetNextBlockInChain(StorageImpl* This, ULONG blockIndex, ULONG nextBlock);
|
static void StorageImpl_SetNextBlockInChain(StorageImpl* This, ULONG blockIndex, ULONG nextBlock);
|
||||||
static HRESULT StorageImpl_LoadFileHeader(StorageImpl* This);
|
static HRESULT StorageImpl_LoadFileHeader(StorageImpl* This);
|
||||||
|
@ -3080,12 +3080,12 @@ static ULONG StorageImpl_GetNextFreeBigBlock(
|
||||||
{
|
{
|
||||||
ULONG depotBlockIndexPos;
|
ULONG depotBlockIndexPos;
|
||||||
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
|
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
|
||||||
BOOL success;
|
|
||||||
ULONG depotBlockOffset;
|
ULONG depotBlockOffset;
|
||||||
ULONG blocksPerDepot = This->bigBlockSize / sizeof(ULONG);
|
ULONG blocksPerDepot = This->bigBlockSize / sizeof(ULONG);
|
||||||
ULONG nextBlockIndex = BLOCK_SPECIAL;
|
ULONG nextBlockIndex = BLOCK_SPECIAL;
|
||||||
int depotIndex = 0;
|
int depotIndex = 0;
|
||||||
ULONG freeBlock = BLOCK_UNUSED;
|
ULONG freeBlock = BLOCK_UNUSED;
|
||||||
|
ULONG read;
|
||||||
ULARGE_INTEGER neededSize;
|
ULARGE_INTEGER neededSize;
|
||||||
STATSTG statstg;
|
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) &&
|
while ( ( (depotBlockOffset/sizeof(ULONG) ) < blocksPerDepot) &&
|
||||||
( nextBlockIndex != BLOCK_UNUSED))
|
( nextBlockIndex != BLOCK_UNUSED))
|
||||||
|
@ -3257,7 +3257,7 @@ static ULONG Storage32Impl_GetExtDepotBlock(StorageImpl* This, ULONG depotIndex)
|
||||||
{
|
{
|
||||||
extBlockIndex = This->extBigBlockDepotLocations[extBlockCount];
|
extBlockIndex = This->extBigBlockDepotLocations[extBlockCount];
|
||||||
|
|
||||||
StorageImpl_ReadBigBlock(This, extBlockIndex, depotBuffer);
|
StorageImpl_ReadBigBlock(This, extBlockIndex, depotBuffer, NULL);
|
||||||
|
|
||||||
num_blocks = This->bigBlockSize / 4;
|
num_blocks = This->bigBlockSize / 4;
|
||||||
|
|
||||||
|
@ -3419,7 +3419,7 @@ static HRESULT StorageImpl_GetNextBlockInChain(
|
||||||
ULONG depotBlockCount = offsetInDepot / This->bigBlockSize;
|
ULONG depotBlockCount = offsetInDepot / This->bigBlockSize;
|
||||||
ULONG depotBlockOffset = offsetInDepot % This->bigBlockSize;
|
ULONG depotBlockOffset = offsetInDepot % This->bigBlockSize;
|
||||||
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
|
BYTE depotBuffer[MAX_BIG_BLOCK_SIZE];
|
||||||
BOOL success;
|
ULONG read;
|
||||||
ULONG depotBlockIndexPos;
|
ULONG depotBlockIndexPos;
|
||||||
int index, num_blocks;
|
int index, num_blocks;
|
||||||
|
|
||||||
|
@ -3451,9 +3451,9 @@ static HRESULT StorageImpl_GetNextBlockInChain(
|
||||||
depotBlockIndexPos = Storage32Impl_GetExtDepotBlock(This, depotBlockCount);
|
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;
|
return STG_E_READFAULT;
|
||||||
|
|
||||||
num_blocks = This->bigBlockSize / 4;
|
num_blocks = This->bigBlockSize / 4;
|
||||||
|
@ -4035,26 +4035,30 @@ HRESULT StorageImpl_WriteDirEntry(
|
||||||
return StorageImpl_WriteRawDirEntry(This, index, currentEntry);
|
return StorageImpl_WriteRawDirEntry(This, index, currentEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL StorageImpl_ReadBigBlock(
|
static HRESULT StorageImpl_ReadBigBlock(
|
||||||
StorageImpl* This,
|
StorageImpl* This,
|
||||||
ULONG blockIndex,
|
ULONG blockIndex,
|
||||||
void* buffer)
|
void* buffer,
|
||||||
|
ULONG* out_read)
|
||||||
{
|
{
|
||||||
ULARGE_INTEGER ulOffset;
|
ULARGE_INTEGER ulOffset;
|
||||||
DWORD read=0;
|
DWORD read=0;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
ulOffset.u.HighPart = 0;
|
ulOffset.u.HighPart = 0;
|
||||||
ulOffset.u.LowPart = StorageImpl_GetBigBlockOffset(This, blockIndex);
|
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. */
|
/* File ends during this block; fill the rest with 0's. */
|
||||||
memset((LPBYTE)buffer+read, 0, This->bigBlockSize-read);
|
memset((LPBYTE)buffer+read, 0, This->bigBlockSize-read);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (read != 0);
|
if (out_read) *out_read = read;
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL StorageImpl_ReadDWordFromBigBlock(
|
static BOOL StorageImpl_ReadDWordFromBigBlock(
|
||||||
|
@ -6222,7 +6226,7 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
|
||||||
{
|
{
|
||||||
if (!cachedBlock->read)
|
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;
|
return STG_E_READFAULT;
|
||||||
|
|
||||||
cachedBlock->read = 1;
|
cachedBlock->read = 1;
|
||||||
|
@ -6306,7 +6310,7 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
|
||||||
{
|
{
|
||||||
if (!cachedBlock->read && bytesToWrite != This->parentStorage->bigBlockSize)
|
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;
|
return STG_E_READFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue