7zip: Use checked arithmetic more often
Use checked arithmetic to avoid overflows. Use it also where checks are already in place for better readability. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
This commit is contained in:
1 parent
a6e72ee36a
commit
c1ddb31c07
1 file changed
+8
-6
@@ -2345,8 +2345,11 @@ read_Folder(struct archive_read *a, struct _7z_folder *f)
|
||||
(size_t)f->coders[i].propertiesSize);
|
||||
}
|
||||
|
||||
numInStreamsTotal += f->coders[i].numInStreams;
|
||||
numOutStreamsTotal += f->coders[i].numOutStreams;
|
||||
if (archive_ckd_add_u64(&numInStreamsTotal,
|
||||
numInStreamsTotal, f->coders[i].numInStreams) ||
|
||||
archive_ckd_add_u64(&numOutStreamsTotal,
|
||||
numOutStreamsTotal, f->coders[i].numOutStreams))
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (numOutStreamsTotal == 0 ||
|
||||
@@ -2619,9 +2622,8 @@ read_SubStreamsInfo(struct archive_read *a, struct _7z_substream_info *ss,
|
||||
for (pack = 1; pack < f[i].numUnpackStreams; pack++) {
|
||||
if (parse_7zip_uint64(a, usizes) < 0)
|
||||
return (-1);
|
||||
if (*usizes > UINT64_MAX - sum)
|
||||
if (archive_ckd_add_u64(&sum, sum, *usizes++))
|
||||
return (-1);
|
||||
sum += *usizes++;
|
||||
}
|
||||
}
|
||||
size = folder_uncompressed_size(&f[i]);
|
||||
@@ -2721,9 +2723,9 @@ read_StreamsInfo(struct archive_read *a, struct _7z_stream_info *si)
|
||||
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])
|
||||
if (archive_ckd_add_u64(&packPos,
|
||||
packPos, si->pi.sizes[i]))
|
||||
return (-1);
|
||||
packPos += si->pi.sizes[i];
|
||||
if (packPos > zip->header_offset)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user