From 11990815a63a6e5a4ab8af565b9b4b207b3cf3e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konrad=20Ku=C5=9Bnierz?= Date: Sun, 10 May 2015 22:31:10 +0200 Subject: [PATCH] Correctly load corrupted otmm file, should fix #606 --- src/client/minimap.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index 58004ad5..734b76c6 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -333,6 +333,7 @@ bool Minimap::loadOtmm(const std::string& fileName) uint blockSize = MMBLOCK_SIZE * MMBLOCK_SIZE * sizeof(MinimapTile); std::vector compressBuffer(compressBound(blockSize)); + std::vector decompressBuffer(blockSize); while(true) { Position pos; @@ -344,13 +345,19 @@ bool Minimap::loadOtmm(const std::string& fileName) if(!pos.isValid()) break; + // corrupted file + if(pos.z >= Otc::MAX_Z+1) + break; + MinimapBlock& block = getBlock(pos); ulong len = fin->getU16(); ulong destLen = blockSize; fin->read(compressBuffer.data(), len); - int ret = uncompress((uchar*)&block.getTiles(), &destLen, compressBuffer.data(), len); - assert(ret == Z_OK); - assert(destLen == blockSize); + int ret = uncompress(decompressBuffer.data(), &destLen, compressBuffer.data(), len); + if(ret != Z_OK || destLen != blockSize) + break; + + memcpy((uchar*)&block.getTiles(), decompressBuffer.data(), blockSize); block.mustUpdate(); block.justSaw(); }