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:
parent
07f9087365
commit
9c95761d9e
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue