aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward Barnard2017-03-03 13:59:05 +0000
committerEdward Barnard2017-03-03 13:59:05 +0000
commit8eef734830f302066f61c826d6e132a1bb9fc650 (patch)
tree51217c6acffce9624cbc49d14510f099cb116737
parentaf6c771aca701c566920eac04141c16c2b7c6c91 (diff)
downloadrust-plist-fuzz.tar.bz2
Don’t panic on invalid object references.fuzz
-rw-r--r--src/binary/reader.rs2
-rw-r--r--tests/fuzzer.rs6
2 files changed, 7 insertions, 1 deletions
diff --git a/src/binary/reader.rs b/src/binary/reader.rs
index 600d3b3..474e69d 100644
--- a/src/binary/reader.rs
+++ b/src/binary/reader.rs
@@ -145,7 +145,7 @@ impl<R: Read + Seek> EventReader<R> {
fn seek_to_object(&mut self, object_ref: u64) -> Result<u64> {
let object_ref = try!(u64_to_usize(object_ref));
- let offset = *&self.object_offsets[object_ref];
+ let offset = *self.object_offsets.get(object_ref).ok_or(Error::InvalidData)?;
let pos = try!(self.reader.seek(SeekFrom::Start(offset)));
Ok(pos)
}
diff --git a/tests/fuzzer.rs b/tests/fuzzer.rs
index 701df5e..4d7b151 100644
--- a/tests/fuzzer.rs
+++ b/tests/fuzzer.rs
@@ -15,6 +15,12 @@ fn too_large_allocation_2() {
test_fuzzer_data_err(data);
}
+#[test]
+fn empty_offset_table() {
+ let data = b"bplist00;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<)\x9fXTX(";
+ test_fuzzer_data_err(data);
+}
+
fn test_fuzzer_data_err(data: &[u8]) {
let cursor = Cursor::new(data);
let res = Plist::read(cursor);