summaryrefslogtreecommitdiff
path: root/source/files.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2010-06-11 22:13:56 +0000
committerAndrey Nazarov <skuller@skuller.net>2010-06-11 22:13:56 +0000
commit2778e48d18a720ec2f94343dc4ca8c335874877d (patch)
tree8e8181c40b8699a8e06899e4badbea00825dd764 /source/files.c
parent698c7913e8e56649cb413b155bc9381e91f10bbe (diff)
Skip empty files/directories when loading ZIP archives.
Diffstat (limited to 'source/files.c')
-rw-r--r--source/files.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/source/files.c b/source/files.c
index d238cb2..e2e34f9 100644
--- a/source/files.c
+++ b/source/files.c
@@ -1408,11 +1408,13 @@ static pack_t *FS_LoadZipFile( const char *packfile ) {
goto fail;
}
- namesLength += strlen( name ) + 1;
+ // skip directories and empty files
+ if( zInfo.uncompressed_size ) {
+ namesLength += strlen( name ) + 1;
+ }
if( i != numFiles - 1 && unzGoToNextFile( zFile ) != UNZ_OK ) {
Com_WPrintf( "unzGoToNextFile() failed on %s\n", packfile );
-
}
}
@@ -1443,18 +1445,20 @@ static pack_t *FS_LoadZipFile( const char *packfile ) {
for( i = 0, file = pack->files; i < numFiles; i++, file++ ) {
unzGetCurrentFileInfo( zFile, &zInfo, name, sizeof( name ), NULL, 0, NULL, 0 );
- len = strlen( name ) + 1;
- file->name = names;
+ if( zInfo.uncompressed_size ) {
+ len = strlen( name ) + 1;
+ file->name = names;
- strcpy( file->name, name );
- file->filepos = unzGetCurrentFileInfoPosition( zFile );
- file->filelen = zInfo.uncompressed_size;
+ strcpy( file->name, name );
+ file->filepos = unzGetCurrentFileInfoPosition( zFile );
+ file->filelen = zInfo.uncompressed_size;
- hash = Com_HashPath( file->name, hashSize );
- file->hashNext = pack->fileHash[hash];
- pack->fileHash[hash] = file;
+ hash = Com_HashPath( file->name, hashSize );
+ file->hashNext = pack->fileHash[hash];
+ pack->fileHash[hash] = file;
- names += len;
+ names += len;
+ }
if( i != numFiles - 1 ) {
unzGoToNextFile( zFile );