ole32: Always check the size of the small block root chain.

In some storage files, the size of this stream is not a multiple of the big
block size. This means that we may need to enlarge the stream even when we
don't really have to allocate more space for it.
This commit is contained in:
Vincent Povirk 2010-05-27 17:16:22 -05:00 committed by Alexandre Julliard
parent 07f9087365
commit 9c95761d9e
1 changed files with 22 additions and 24 deletions

View File

@ -6390,6 +6390,9 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG nextBlockIndex = BLOCK_END_OF_CHAIN;
HRESULT res = S_OK;
ULONG smallBlocksPerBigBlock;
DirEntry rootEntry;
ULONG blocksRequired;
ULARGE_INTEGER old_size, size_required;
offsetOfBlockInDepot.u.HighPart = 0;
@ -6449,34 +6452,29 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
/*
* Verify if we have to allocate big blocks to contain small blocks
*/
if (blockIndex % smallBlocksPerBigBlock == 0)
blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
if (size_required.QuadPart > old_size.QuadPart)
{
DirEntry rootEntry;
ULONG blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
ULARGE_INTEGER old_size, size_required;
BlockChainStream_SetSize(
This->parentStorage->smallBlockRootChain,
size_required);
size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
StorageImpl_ReadDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
rootEntry.size = size_required;
if (size_required.QuadPart > old_size.QuadPart)
{
BlockChainStream_SetSize(
This->parentStorage->smallBlockRootChain,
size_required);
StorageImpl_ReadDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
rootEntry.size = size_required;
StorageImpl_WriteDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
}
StorageImpl_WriteDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
}
return blockIndex;