5 Commits

Author SHA1 Message Date
Antoine Cœur
6b302a33b1 2.1.1 2017-10-12 01:21:47 +08:00
Antoine Cœur
6128b6faf3 Merge pull request #403 from ZipArchive/unzCountEntries
workaround incomplete unzip when above 65535 entries
2017-10-11 12:05:39 -05:00
Antoine Cœur
8e3a03d78b Merge pull request #402 from ZipArchive/IncorrectHeaders
hotfix for unzipping (fix #391)
2017-10-11 12:03:05 -05:00
Antoine Cœur
5b9e60e4ea Use arc4random_buf instead of "/dev/urandom" 2017-10-12 00:59:06 +08:00
Antoine Cœur
91e8bff0a7 workaround incorrect file count 2017-10-12 00:07:14 +08:00
6 changed files with 42 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
PODS:
- SSZipArchive (2.1.0)
- SSZipArchive (2.1.1)
DEPENDENCIES:
- SSZipArchive (from `..`)
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
:path: ..
SPEC CHECKSUMS:
SSZipArchive: 1e8e53dcb11bca3ded4738958dc49fc467320a14
SSZipArchive: 14401ade5f8e82aba1ff03e9f88e9de60937ae60
PODFILE CHECKSUM: 5e250843c66c607960128ebfe02ab7d6569102be

View File

@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'SSZipArchive'
s.version = '2.1.0'
s.version = '2.1.1'
s.summary = 'Utility class for zipping and unzipping files on iOS, tvOS, watchOS, and Mac.'
s.description = 'SSZipArchive is a simple utility class for zipping and unzipping files on iOS, tvOS, watchOS, and Mac.'
s.homepage = 'https://github.com/ZipArchive/ZipArchive'

View File

@@ -46,10 +46,6 @@
#define CRC32(c, b) ((*(pcrc_32_tab+(((uint32_t)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
#ifndef ZCR_SEED2
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
#endif
/***************************************************************************/
uint8_t decrypt_byte(uint32_t *pkeys)
@@ -90,11 +86,10 @@ void init_keys(const char *passwd, uint32_t *pkeys, const z_crc_t *pcrc_32_tab)
int cryptrand(unsigned char *buf, unsigned int len)
{
static unsigned calls = 0;
int rlen = 0;
#ifdef _WIN32
HCRYPTPROV provider;
unsigned __int64 pentium_tsc[1];
int rlen = 0;
int result = 0;
@@ -112,24 +107,12 @@ int cryptrand(unsigned char *buf, unsigned int len)
QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
buf[rlen] = ((unsigned char*)pentium_tsc)[rlen % 8];
}
#else
int frand = open("/dev/urandom", O_RDONLY);
if (frand != -1)
{
rlen = (int)read(frand, buf, len);
close(frand);
}
#endif
if (rlen < (int)len)
{
/* Ensure different random header each time */
if (++calls == 1)
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
while (rlen < (int)len)
buf[rlen++] = (rand() >> 7) & 0xff;
}
return rlen;
#else
arc4random_buf(buf, len);
return len;
#endif
}
int crypthead(const char *passwd, uint8_t *buf, int buf_size, uint32_t *pkeys,

View File

@@ -350,6 +350,7 @@ static unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_f
uint64_t value64 = 0;
voidpf filestream = NULL;
int err = UNZ_OK;
int err64 = UNZ_OK;
us.filestream = NULL;
us.filestream_with_CD = NULL;
@@ -412,7 +413,7 @@ static unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_f
if (err == UNZ_OK)
{
/* Search for Zip64 end of central directory header */
int err64 = unzSearchCentralDir64(&us.z_filefunc, &central_pos64, us.filestream, central_pos);
err64 = unzSearchCentralDir64(&us.z_filefunc, &central_pos64, us.filestream, central_pos);
if (err64 == UNZ_OK)
{
central_pos = central_pos64;
@@ -454,7 +455,7 @@ static unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_f
if (unzReadUInt64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)
err = UNZ_ERRNO;
}
else if ((us.gi.number_entry == UINT16_MAX) || (us.size_central_dir == UINT16_MAX) || (us.offset_central_dir == UINT32_MAX))
else if ((us.size_central_dir == UINT16_MAX) || (us.offset_central_dir == UINT32_MAX))
err = UNZ_BADZIPFILE;
}
}
@@ -491,6 +492,10 @@ static unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_f
if (s != NULL)
{
*s = us;
if (err64 != UNZ_OK)
// workaround incorrect count #184
s->gi.number_entry = unzCountEntries(s);
unzGoToFirstFile((unzFile)s);
}
return (unzFile)s;
@@ -1026,6 +1031,29 @@ static int unzCheckCurrentFileCoherencyHeader(unz64_internal *s, uint32_t *psize
return err;
}
extern uint64_t ZEXPORT unzCountEntries(const unzFile file)
{
if (file == NULL)
return 0;
unz64_internal s = *(unz64_internal*)file;
s.pos_in_central_dir = s.offset_central_dir;
s.num_file = 0;
while (UNZ_OK == unzGetCurrentFileInfoInternal(&s,
&s.cur_file_info,
&s.cur_file_info_internal,
NULL, 0, NULL, 0, NULL, 0))
{
s.pos_in_central_dir += SIZECENTRALDIRITEM
+ s.cur_file_info.size_filename
+ s.cur_file_info.size_file_extra
+ s.cur_file_info.size_file_comment;
s.num_file += 1;
}
return s.num_file;
}
/*
Open for reading data the current file in the zipfile.
If there is no error and the file is opened, the return value is UNZ_OK.

View File

@@ -100,6 +100,8 @@ extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t com
uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0 */
extern uint64_t ZEXPORT unzCountEntries(const unzFile file);
/***************************************************************************/
/* Reading the content of the current zipfile, you can open it, read data from it, and close it
(you can close it before reading all the file) */

View File

@@ -1,5 +1,5 @@
PODS:
- SSZipArchive (2.1.0)
- SSZipArchive (2.1.1)
DEPENDENCIES:
- SSZipArchive (from `..`)
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
:path: ..
SPEC CHECKSUMS:
SSZipArchive: 1e8e53dcb11bca3ded4738958dc49fc467320a14
SSZipArchive: 14401ade5f8e82aba1ff03e9f88e9de60937ae60
PODFILE CHECKSUM: 0dc500eb72745751ccba7677de4da5534fcef36d