diff options
Diffstat (limited to 'Minecraft.World/compression.cpp')
| -rw-r--r-- | Minecraft.World/compression.cpp | 42 |
1 files changed, 8 insertions, 34 deletions
diff --git a/Minecraft.World/compression.cpp b/Minecraft.World/compression.cpp index 4122922b..8c2e51c0 100644 --- a/Minecraft.World/compression.cpp +++ b/Minecraft.World/compression.cpp @@ -237,19 +237,9 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz unsigned char *dynamicRleBuf = nullptr; HRESULT decompressResult; - unsigned int safeRleSize = max(rleSize, *pDestSize); - - const unsigned int MAX_RLE_ALLOC = 16 * 1024 * 1024; // 16 MB - if (safeRleSize > MAX_RLE_ALLOC) - { - LeaveCriticalSection(&rleDecompressLock); - *pDestSize = 0; - return E_FAIL; - } - - if (safeRleSize > staticRleSize) + if(*pDestSize > rleSize) { - rleSize = safeRleSize; + rleSize = *pDestSize; dynamicRleBuf = new unsigned char[rleSize]; decompressResult = Decompress(dynamicRleBuf, &rleSize, pSource, SrcSize); pucIn = (unsigned char *)dynamicRleBuf; @@ -273,7 +263,7 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz //unsigned char *pucIn = (unsigned char *)rleDecompressBuf; const unsigned char *pucEnd = pucIn + rleSize; unsigned char *pucOut = static_cast<unsigned char*>(pDestination); - unsigned char *pucOutEnd = pucOut + *pDestSize; + const unsigned char *pucOutEnd = pucOut + *pDestSize; while( pucIn != pucEnd ) { @@ -285,11 +275,7 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz if( count < 3 ) { count++; - if (pucOut + count > pucOutEnd) - { - pucOut = pucOutEnd; - break; - } + if( pucOut + count > pucOutEnd ) break; for( unsigned int i = 0; i < count; i++ ) { *pucOut++ = 255; @@ -300,11 +286,7 @@ HRESULT Compression::DecompressLZXRLE(void *pDestination, unsigned int *pDestSiz count++; if( pucIn >= pucEnd ) break; const unsigned char data = *pucIn++; - if (pucOut + count > pucOutEnd) - { - pucOut = pucOutEnd; - break; - } + if( pucOut + count > pucOutEnd ) break; for( unsigned int i = 0; i < count; i++ ) { *pucOut++ = data; @@ -335,7 +317,7 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize, unsigned char *pucIn = static_cast<unsigned char *>(pSource); const unsigned char *pucEnd = pucIn + SrcSize; unsigned char *pucOut = static_cast<unsigned char*>(pDestination); - unsigned char *pucOutEnd = pucOut + *pDestSize; + const unsigned char *pucOutEnd = pucOut + *pDestSize; while( pucIn != pucEnd ) { @@ -347,11 +329,7 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize, if( count < 3 ) { count++; - if (pucOut + count > pucOutEnd) - { - pucOut = pucOutEnd; - break; - } + if( pucOut + count > pucOutEnd ) break; for( unsigned int i = 0; i < count; i++ ) { *pucOut++ = 255; @@ -362,11 +340,7 @@ HRESULT Compression::DecompressRLE(void *pDestination, unsigned int *pDestSize, count++; if( pucIn >= pucEnd ) break; const unsigned char data = *pucIn++; - if (pucOut + count > pucOutEnd) - { - pucOut = pucOutEnd; - break; - } + if( pucOut + count > pucOutEnd ) break; for( unsigned int i = 0; i < count; i++ ) { *pucOut++ = data; |
