[Scummvm-cvs-logs] SF.net SVN: scummvm:[39069] scummvm/trunk/engines/sci/scicore/decompress01. cpp
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Mon Mar 2 11:41:37 CET 2009
Revision: 39069
http://scummvm.svn.sourceforge.net/scummvm/?rev=39069&view=rev
Author: thebluegr
Date: 2009-03-02 10:41:37 +0000 (Mon, 02 Mar 2009)
Log Message:
-----------
Slight cleanup
Modified Paths:
--------------
scummvm/trunk/engines/sci/scicore/decompress01.cpp
Modified: scummvm/trunk/engines/sci/scicore/decompress01.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/decompress01.cpp 2009-03-02 10:34:31 UTC (rev 39068)
+++ scummvm/trunk/engines/sci/scicore/decompress01.cpp 2009-03-02 10:41:37 UTC (rev 39069)
@@ -548,66 +548,33 @@
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;
+ if (decrypt2(result->data, buffer, result->size, compressedLength))
+ overflow = true;
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;
- 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 @@
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;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list