forked from Mirrors/wine-wine
ole32: Fix excessive file sizes for Storage files.
The IStorage (DocFile) implementation was adding empty blocks at the end of the file every time a caller wrote data that was not a multiple of 512 bytes. If the caller made a lot of very small writes the file size could be huge even though the data in the file was tiny. This was caused by BlockChainStream_SetSize trying to allocate file blocks for the new data using a condition that bore no relationship to the required condition, and it was not necessary to do so at that time since it is done (the right way) by StorageImpl_GetNextFreeBigBlock (called via BlockChainStream_Enlarge).oldstable
parent
3b95aad505
commit
1be295fb47
|
@ -4812,21 +4812,6 @@ BOOL BlockChainStream_SetSize(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ULARGE_INTEGER fileSize =
|
|
||||||
BIGBLOCKFILE_GetSize(This->parentStorage->bigBlockFile);
|
|
||||||
|
|
||||||
ULONG diff = newSize.u.LowPart - size.u.LowPart;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure the file stays a multiple of blocksize
|
|
||||||
*/
|
|
||||||
if ((diff % This->parentStorage->bigBlockSize) != 0)
|
|
||||||
diff += (This->parentStorage->bigBlockSize -
|
|
||||||
(diff % This->parentStorage->bigBlockSize) );
|
|
||||||
|
|
||||||
fileSize.u.LowPart += diff;
|
|
||||||
BIGBLOCKFILE_SetSize(This->parentStorage->bigBlockFile, fileSize);
|
|
||||||
|
|
||||||
BlockChainStream_Enlarge(This, newSize);
|
BlockChainStream_Enlarge(This, newSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue