diff options
Diffstat (limited to 'Minecraft.World/ConsoleSaveFileOriginal.cpp')
| -rw-r--r-- | Minecraft.World/ConsoleSaveFileOriginal.cpp | 17 |
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(); } |
