Skip to content

Commit de08ca1

Browse files
committed
Fix an overflow when rounding up the size of a file
Closes #265
1 parent 60c6bd8 commit de08ca1

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/archive.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,10 @@ impl<'a> EntriesFields<'a> {
298298

299299
// Store where the next entry is, rounding up by 512 bytes (the size of
300300
// a header);
301-
let size = (size + 511) & !(512 - 1);
302-
self.next += size;
301+
let size = size
302+
.checked_add(511)
303+
.ok_or_else(|| other("size overflow"))?;
304+
self.next += size & !(512 - 1);
303305

304306
Ok(Some(ret.into_entry()))
305307
}

tests/all.rs

+13
Original file line numberDiff line numberDiff line change
@@ -1245,3 +1245,16 @@ fn tar_directory_containing_special_files() {
12451245
t!(ar.append_path("null"));
12461246
t!(ar.finish());
12471247
}
1248+
1249+
#[test]
1250+
fn header_size_overflow() {
1251+
let mut ar = Builder::new(Vec::new());
1252+
let mut header = Header::new_gnu();
1253+
header.set_size(0xffffffffffffffff);
1254+
header.set_cksum();
1255+
ar.append(&mut header, "x".as_bytes()).unwrap();
1256+
let result = t!(ar.into_inner());
1257+
let mut ar = Archive::new(&result[..]);
1258+
let mut e = ar.entries().unwrap();
1259+
assert!(e.next().unwrap().is_err());
1260+
}

0 commit comments

Comments
 (0)