diff options
author | Andrey Nazarov <skuller@skuller.net> | 2010-06-11 22:13:56 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2010-06-11 22:13:56 +0000 |
commit | 2778e48d18a720ec2f94343dc4ca8c335874877d (patch) | |
tree | 8e8181c40b8699a8e06899e4badbea00825dd764 /source/files.c | |
parent | 698c7913e8e56649cb413b155bc9381e91f10bbe (diff) |
Skip empty files/directories when loading ZIP archives.
Diffstat (limited to 'source/files.c')
-rw-r--r-- | source/files.c | 26 |
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 ); |