diff options
-rw-r--r-- | engines/sci/scicore/decompress0.cpp | 45 |
1 files changed, 19 insertions, 26 deletions
diff --git a/engines/sci/scicore/decompress0.cpp b/engines/sci/scicore/decompress0.cpp index 2a715fd334..def3a20ea3 100644 --- a/engines/sci/scicore/decompress0.cpp +++ b/engines/sci/scicore/decompress0.cpp @@ -288,39 +288,24 @@ int decompress0(Resource *result, Common::ReadStream &stream, int sci_version) { compressedLength, result->size); #endif + bool overflow = false; + switch (compressionMethod) { case 0: // no compression - if (result->size != compressedLength) { - free(result->data); - result->data = NULL; - result->status = SCI_STATUS_NOMALLOC; - free(buffer); - return SCI_ERROR_DECOMPRESSION_OVERFLOW; - } - memcpy(result->data, buffer, compressedLength); - result->status = SCI_STATUS_ALLOCATED; + if (result->size != compressedLength) + overflow = true; + else + memcpy(result->data, buffer, compressedLength); break; case 1: // LZW compression - if (decrypt1(result->data, buffer, result->size, compressedLength)) { - free(result->data); - result->data = 0; // So that we know that it didn't work - result->status = SCI_STATUS_NOMALLOC; - free(buffer); - return SCI_ERROR_DECOMPRESSION_OVERFLOW; - } - result->status = SCI_STATUS_ALLOCATED; + if (decrypt1(result->data, buffer, result->size, compressedLength)) + overflow = true; break; case 2: // Some sort of Huffman encoding - if (decrypt2(result->data, buffer, result->size, compressedLength)) { - free(result->data); - result->data = 0; // So that we know that it didn't work - result->status = SCI_STATUS_NOMALLOC; - free(buffer); - return SCI_ERROR_DECOMPRESSION_OVERFLOW; - } - result->status = SCI_STATUS_ALLOCATED; + if (decrypt2(result->data, buffer, result->size, compressedLength)) + overflow = true; break; default: @@ -334,8 +319,16 @@ int decompress0(Resource *result, Common::ReadStream &stream, int sci_version) { return SCI_ERROR_UNKNOWN_COMPRESSION; } - free(buffer); + if (overflow) { + free(result->data); + result->data = 0; // So that we know that it didn't work + result->status = SCI_STATUS_NOMALLOC; + free(buffer); + return SCI_ERROR_DECOMPRESSION_OVERFLOW; + } + result->status = SCI_STATUS_ALLOCATED; + free(buffer); return 0; } |