diff --git a/src/date.rs b/src/date.rs index 2e2536e..d5e72b2 100644 --- a/src/date.rs +++ b/src/date.rs @@ -51,11 +51,13 @@ impl Date { let dur_since_plist_epoch = Duration::new(seconds, subsec_nanos); let inner = if is_negative { - plist_epoch - dur_since_plist_epoch + plist_epoch.checked_sub(dur_since_plist_epoch) } else { - plist_epoch + dur_since_plist_epoch + plist_epoch.checked_add(dur_since_plist_epoch) }; + let inner = inner.ok_or(InfiniteOrNanDate)?; + Ok(Date { inner }) } diff --git a/tests/fuzzer.rs b/tests/fuzzer.rs index 018beb6..df5d81a 100644 --- a/tests/fuzzer.rs +++ b/tests/fuzzer.rs @@ -59,6 +59,20 @@ fn issue_22_binary_with_byte_ref_size() { test_fuzzer_data_ok(data); } +#[test] +fn overflow_instant_add() { + let data = b"bplist00\x10\x01\x00\x00\x00\x00\x00\x003~\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00"; + + test_fuzzer_data_err(data); +} + +#[test] +fn overflow_instant_sub() { + let data = b"bplist00\x10\x01\x00\x00\x00\x00\x00\x003\xfe\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00"; + + test_fuzzer_data_err(data); +} + fn test_fuzzer_data(data: &[u8]) -> Result { let cursor = Cursor::new(data); Value::from_reader(cursor)