diff options
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/scicore/decompress01.cpp | 73 |
1 files changed, 24 insertions, 49 deletions
diff --git a/engines/sci/scicore/decompress01.cpp b/engines/sci/scicore/decompress01.cpp index 13d8de1944..dd3e140254 100644 --- a/engines/sci/scicore/decompress01.cpp +++ b/engines/sci/scicore/decompress01.cpp @@ -548,66 +548,33 @@ int decompress01(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: // Some 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; - break; - - case 2: // ??? - decryptinit3(); - if (decrypt3(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; + case 2: case 3: - decryptinit3(); - if (decrypt3(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->data = view_reorder(result->data, result->size); - result->status = SCI_STATUS_ALLOCATED; - break; - case 4: decryptinit3(); if (decrypt3(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; + overflow = true; + } else { + if (compressionMethod == 3) + result->data = view_reorder(result->data, result->size); + if (compressionMethod == 4) + result->data = pic_reorder(result->data, result->size); } - result->data = pic_reorder(result->data, result->size); - result->status = SCI_STATUS_ALLOCATED; break; default: @@ -621,8 +588,16 @@ int decompress01(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; } |