aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/ConsoleSaveFileOriginal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/ConsoleSaveFileOriginal.cpp')
-rw-r--r--Minecraft.World/ConsoleSaveFileOriginal.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp
index 3a2b5ef1..d4db4e25 100644
--- a/Minecraft.World/ConsoleSaveFileOriginal.cpp
+++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp
@@ -463,6 +463,23 @@ BOOL ConsoleSaveFileOriginal::closeHandle( FileEntry *file )
void ConsoleSaveFileOriginal::finalizeWrite()
{
LockSaveAccess();
+
+ // Ensure buffer is large enough for the full file including header table.
+ // New file entries (e.g. from RegionFile creation) increase GetFileSize()
+ // without triggering MoveDataBeyond, so the committed pages may be short.
+ DWORD currentHeapSize = pagesCommitted * CSF_PAGE_SIZE;
+ DWORD desiredSize = header.GetFileSize();
+ if( desiredSize > currentHeapSize )
+ {
+ unsigned int pagesRequired = ( desiredSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE;
+ void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE);
+ if( pvRet == NULL )
+ {
+ __debugbreak();
+ }
+ pagesCommitted = pagesRequired;
+ }
+
header.WriteHeader( pvSaveMem );
ReleaseSaveAccess();
}