aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward Barnard2017-05-05 09:55:06 +0100
committerEdward Barnard2017-05-05 09:55:06 +0100
commit3f67a83b884925288e782033454e72944257b219 (patch)
tree1af091c039c1a15ce543e2e4b586b21bcf650dbe
parent1a60c49909c4dfffa112a7b9e63dbf87224c2e16 (diff)
downloadrust-plist-3f67a83b884925288e782033454e72944257b219.tar.bz2
Check binary plist offset size is valid.
-rw-r--r--src/binary/reader.rs6
-rw-r--r--tests/data/binary_zero_offset_size.plistbin0 -> 276 bytes
-rw-r--r--tests/fuzzer.rs6
3 files changed, 12 insertions, 0 deletions
diff --git a/src/binary/reader.rs b/src/binary/reader.rs
index e783dfb..11d5dfa 100644
--- a/src/binary/reader.rs
+++ b/src/binary/reader.rs
@@ -85,11 +85,17 @@ impl<R: Read + Seek> EventReader<R> {
let trailer_start = self.reader.seek(SeekFrom::End(-32 + 6))?;
let offset_size = self.reader.read_u8()?;
+ match offset_size {
+ 1 | 2 | 4 | 8 => (),
+ _ => return Err(Error::InvalidData)
+ }
+
self.ref_size = self.reader.read_u8()?;
match self.ref_size {
1 | 2 | 4 | 8 => (),
_ => return Err(Error::InvalidData)
}
+
let num_objects = self.reader.read_u64::<BigEndian>()?;
let top_object = self.reader.read_u64::<BigEndian>()?;
let offset_table_offset = self.reader.read_u64::<BigEndian>()?;
diff --git a/tests/data/binary_zero_offset_size.plist b/tests/data/binary_zero_offset_size.plist
new file mode 100644
index 0000000..83ede66
--- /dev/null
+++ b/tests/data/binary_zero_offset_size.plist
Binary files differ
diff --git a/tests/fuzzer.rs b/tests/fuzzer.rs
index f5cd4c2..72be1b8 100644
--- a/tests/fuzzer.rs
+++ b/tests/fuzzer.rs
@@ -27,6 +27,12 @@ fn binary_circular_reference() {
test_fuzzer_data_err(data);
}
+#[test]
+fn binary_zero_offset_size() {
+ let data = include_bytes!("data/binary_zero_offset_size.plist");
+ test_fuzzer_data_err(data);
+}
+
// Issue 20 - not found by fuzzing but this is a convenient place to put the test.
#[test]
fn issue_20_binary_with_data_in_trailer() {