From 6e1f2505fdefe67ce73f380e896eca3539b838c9 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 27 May 2010 17:16:22 -0500 Subject: [PATCH] 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 used to not be a problem because we didn't check the size when reading block chain streams. --- dlls/ole32/storage32.c | 42 ++++++++++++++++++++---------------------- 1 files changed, 20 insertions(+), 22 deletions(-) diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index ce4e885..98df144 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -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; -- 1.7.0.4