#error This header is only to be used internally to libarchive.
#endif
+#include <stddef.h>
+
/*
* When zlib is unavailable, we should still be able to validate
* uncompressed zip archives. That requires us to be able to compute
static volatile int crc_tbl_inited = 0;
static unsigned long crc_tbl[256];
+ if (_p == NULL)
+ return (0);
+
if (!crc_tbl_inited) {
for (b = 0; b < 256; ++b) {
crc2 = b;
usizes = ss->unpackSizes;
for (i = 0; i < numFolders; i++) {
unsigned pack;
- uint64_t sum;
+ uint64_t size, sum;
if (f[i].numUnpackStreams == 0)
continue;
for (pack = 1; pack < f[i].numUnpackStreams; pack++) {
if (parse_7zip_uint64(a, usizes) < 0)
return (-1);
+ if (*usizes > UINT64_MAX - sum)
+ return (-1);
sum += *usizes++;
}
}
- *usizes++ = folder_uncompressed_size(&f[i]) - sum;
+ size = folder_uncompressed_size(&f[i]);
+ if (size < sum)
+ return (-1);
+ *usizes++ = size - sum;
}
if (type == kSize) {
packPos = si->pi.pos;
for (i = 0; i < si->pi.numPackStreams; i++) {
si->pi.positions[i] = packPos;
+ if (packPos > UINT64_MAX - si->pi.sizes[i])
+ return (-1);
packPos += si->pi.sizes[i];
if (packPos > zip->header_offset)
return (-1);
f = si->ci.folders;
for (i = 0; i < si->ci.numFolders; i++) {
f[i].packIndex = packIndex;
+ if (f[i].numPackedStreams > UINT32_MAX)
+ return (-1);
+ if (packIndex > UINT32_MAX - (uint32_t)f[i].numPackedStreams)
+ return (-1);
packIndex += (uint32_t)f[i].numPackedStreams;
if (packIndex > si->pi.numPackStreams)
return (-1);
/* Copy mode. */
*buff = __archive_read_ahead(a, minimum, &bytes_avail);
- if (bytes_avail <= 0) {
+ if (*buff == NULL) {
archive_set_error(&a->archive,
ARCHIVE_ERRNO_FILE_FORMAT,
"Truncated 7-Zip file data");