aboutsummaryrefslogtreecommitdiff
path: root/common/unzip.cpp
diff options
context:
space:
mode:
authorMatthew Hoops2011-05-11 00:30:02 -0400
committerMatthew Hoops2011-05-11 00:30:28 -0400
commita1d41da096c0bcf502a85919cb1cb1ee471719c5 (patch)
tree8c51419daa486f1d4833757db4715dadab6c3497 /common/unzip.cpp
parentaccb0c2a5d0c9e7b353cda4b74f511a498ed8073 (diff)
parent33c3e19cea2a08fbf26ecbe940763e8ee1c37d28 (diff)
downloadscummvm-rg350-a1d41da096c0bcf502a85919cb1cb1ee471719c5.tar.gz
scummvm-rg350-a1d41da096c0bcf502a85919cb1cb1ee471719c5.tar.bz2
scummvm-rg350-a1d41da096c0bcf502a85919cb1cb1ee471719c5.zip
Merge remote branch 'upstream/master' into t7g-ios
Conflicts: audio/decoders/qdm2.h common/util.cpp engines/groovie/music.cpp engines/groovie/resource.h video/qt_decoder.cpp video/qt_decoder.h
Diffstat (limited to 'common/unzip.cpp')
-rw-r--r--common/unzip.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/common/unzip.cpp b/common/unzip.cpp
index cd5d37f4bd..d56893f3cd 100644
--- a/common/unzip.cpp
+++ b/common/unzip.cpp
@@ -68,6 +68,8 @@
PkWare has also a specification at :
ftp://ftp.pkware.com/probdesc.zip */
+// Disable symbol overrides so that we can use zlib.h
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "common/scummsys.h"
@@ -105,7 +107,6 @@ typedef struct {
#include "common/fs.h"
#include "common/unzip.h"
-#include "common/file.h"
#include "common/memstream.h"
#include "common/hashmap.h"
@@ -1470,11 +1471,13 @@ int ZipArchive::listMembers(Common::ArchiveMemberList &list) {
while (err == UNZ_OK) {
char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
- unzGetCurrentFileInfo(_zipFile, NULL,
- szCurrentFileName, sizeof(szCurrentFileName)-1,
- NULL, 0, NULL, 0);
- list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(szCurrentFileName, this)));
- matches++;
+ if (unzGetCurrentFileInfo(_zipFile, NULL,
+ szCurrentFileName, sizeof(szCurrentFileName)-1,
+ NULL, 0, NULL, 0) == UNZ_OK) {
+ list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(szCurrentFileName, this)));
+ matches++;
+ }
+
err = unzGoToNextFile(_zipFile);
}
@@ -1493,18 +1496,31 @@ Common::SeekableReadStream *ZipArchive::createReadStreamForMember(const Common::
return 0;
unz_file_info fileInfo;
- unzOpenCurrentFile(_zipFile);
- unzGetCurrentFileInfo(_zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
+ if (unzOpenCurrentFile(_zipFile) != UNZ_OK)
+ return 0;
+
+ if (unzGetCurrentFileInfo(_zipFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0) != UNZ_OK)
+ return 0;
+
byte *buffer = (byte *)malloc(fileInfo.uncompressed_size);
assert(buffer);
- unzReadCurrentFile(_zipFile, buffer, fileInfo.uncompressed_size);
- unzCloseCurrentFile(_zipFile);
+
+ if (unzReadCurrentFile(_zipFile, buffer, fileInfo.uncompressed_size) != (int)fileInfo.uncompressed_size) {
+ free(buffer);
+ return 0;
+ }
+
+ if (unzCloseCurrentFile(_zipFile) != UNZ_OK) {
+ free(buffer);
+ return 0;
+ }
+
return new Common::MemoryReadStream(buffer, fileInfo.uncompressed_size, DisposeAfterUse::YES);
// FIXME: instead of reading all into a memory stream, we could
// instead create a new ZipStream class. But then we have to be
// careful to handle the case where the client code opens multiple
- // files in the archive and tries to use them indepenendtly.
+ // files in the archive and tries to use them independently.
}
Archive *makeZipArchive(const String &name) {