Skip to content

Commit a2a82e6

Browse files
committed
Fix the second overflow with self.next
1 parent de08ca1 commit a2a82e6

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/archive.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,10 @@ impl<'a> EntriesFields<'a> {
301301
let size = size
302302
.checked_add(511)
303303
.ok_or_else(|| other("size overflow"))?;
304-
self.next += size & !(512 - 1);
304+
self.next = self
305+
.next
306+
.checked_add(size & !(512 - 1))
307+
.ok_or_else(|| other("size overflow"))?;
305308

306309
Ok(Some(ret.into_entry()))
307310
}

tests/all.rs

+29-2
Original file line numberDiff line numberDiff line change
@@ -1248,13 +1248,40 @@ fn tar_directory_containing_special_files() {
12481248

12491249
#[test]
12501250
fn header_size_overflow() {
1251+
// maximal file size doesn't overflow anything
12511252
let mut ar = Builder::new(Vec::new());
12521253
let mut header = Header::new_gnu();
1253-
header.set_size(0xffffffffffffffff);
1254+
header.set_size(u64::MAX);
12541255
header.set_cksum();
12551256
ar.append(&mut header, "x".as_bytes()).unwrap();
12561257
let result = t!(ar.into_inner());
12571258
let mut ar = Archive::new(&result[..]);
12581259
let mut e = ar.entries().unwrap();
1259-
assert!(e.next().unwrap().is_err());
1260+
let err = e.next().unwrap().err().unwrap();
1261+
assert!(
1262+
err.to_string().contains("size overflow"),
1263+
"bad error: {}",
1264+
err
1265+
);
1266+
1267+
// back-to-back entries that would overflow also don't panic
1268+
let mut ar = Builder::new(Vec::new());
1269+
let mut header = Header::new_gnu();
1270+
header.set_size(1_000);
1271+
header.set_cksum();
1272+
ar.append(&mut header, &[0u8; 1_000][..]).unwrap();
1273+
let mut header = Header::new_gnu();
1274+
header.set_size(u64::MAX - 513);
1275+
header.set_cksum();
1276+
ar.append(&mut header, "x".as_bytes()).unwrap();
1277+
let result = t!(ar.into_inner());
1278+
let mut ar = Archive::new(&result[..]);
1279+
let mut e = ar.entries().unwrap();
1280+
e.next().unwrap().unwrap();
1281+
let err = e.next().unwrap().err().unwrap();
1282+
assert!(
1283+
err.to_string().contains("size overflow"),
1284+
"bad error: {}",
1285+
err
1286+
);
12601287
}

0 commit comments

Comments
 (0)