Commit 9c95761d authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

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.
parent 07f90873
......@@ -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)
{
DirEntry rootEntry;
ULONG blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
ULARGE_INTEGER old_size, size_required;
blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
if (size_required.QuadPart > old_size.QuadPart)
{
BlockChainStream_SetSize(
This->parentStorage->smallBlockRootChain,
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);
StorageImpl_ReadDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
rootEntry.size = size_required;
rootEntry.size = size_required;
StorageImpl_WriteDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
}
StorageImpl_WriteDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
}
return blockIndex;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment