diff --git a/source/marathon/trm.rs b/source/marathon/trm.rs index d02c49b..e7672da 100644 --- a/source/marathon/trm.rs +++ b/source/marathon/trm.rs @@ -16,7 +16,8 @@ pub fn read_group(b: &[u8], text: &[u8]) -> ResultS lines = u16[10]; } - let text = mac_roman_cstr(&text[start..start + size])?; + let text = ok!(text.get(start..start + size), "not enough data")?; + let text = mac_roman_cstr(text)?; let flags = flag_ok!(GroupFlags, flags)?; let ttype = match ttype { 0 => GroupType::Logon(pdata), @@ -78,7 +79,7 @@ pub fn read_term(b: &[u8]) -> ResultS<(Terminal, usize)> let mut p = 10; let text_st = p + SIZE_GROUP * group_n + SIZE_FACE * face_n; - let text = &b[text_st..end]; + let text = ok!(b.get(text_st..end), "bad offset")?; let text = if encoded { fuck_string(text) } else { @@ -86,12 +87,12 @@ pub fn read_term(b: &[u8]) -> ResultS<(Terminal, usize)> }; for _ in 0..group_n { - groups.push(read_group(&b[p..], &text)?); + groups.push(read_group(ok!(b.get(p..), "not enough data")?, &text)?); p += SIZE_GROUP; } for _ in 0..face_n { - faces.push(read_face(&b[p..])?); + faces.push(read_face(ok!(b.get(p..), "not enough data")?)?); p += SIZE_FACE; } diff --git a/tests/data/rand.rs b/tests/data/rand.rs new file mode 100644 index 0000000..cb2008b --- /dev/null +++ b/tests/data/rand.rs @@ -0,0 +1,11 @@ +const RANDOM: [&[u8]; 7] = [ + include_bytes!("random1.bin"), + include_bytes!("random2.bin"), + include_bytes!("random3.bin"), + include_bytes!("random4.bin"), + include_bytes!("random5.bin"), + include_bytes!("random6.bin"), + include_bytes!("random7.bin") +]; + +// EOF diff --git a/tests/data/random1.bin b/tests/data/random1.bin new file mode 100644 index 0000000..7bd354d Binary files /dev/null and b/tests/data/random1.bin differ diff --git a/tests/data/random2.bin b/tests/data/random2.bin new file mode 100644 index 0000000..b6f6c2b Binary files /dev/null and b/tests/data/random2.bin differ diff --git a/tests/data/random3.bin b/tests/data/random3.bin new file mode 100644 index 0000000..5bd34c3 Binary files /dev/null and b/tests/data/random3.bin differ diff --git a/tests/data/random4.bin b/tests/data/random4.bin new file mode 100644 index 0000000..2b025a2 --- /dev/null +++ b/tests/data/random4.bin @@ -0,0 +1,2 @@ +7rE/jP" 񅁻sxt͑P4=>z +tHȶlk4@~ٱ)/fYiω3Z ҥ7 \ No newline at end of file diff --git a/tests/data/random5.bin b/tests/data/random5.bin new file mode 100644 index 0000000..5c32138 --- /dev/null +++ b/tests/data/random5.bin @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/data/random6.bin b/tests/data/random6.bin new file mode 100644 index 0000000..d4f33b6 Binary files /dev/null and b/tests/data/random6.bin differ diff --git a/tests/data/random7.bin b/tests/data/random7.bin new file mode 100644 index 0000000..c08fa8e Binary files /dev/null and b/tests/data/random7.bin differ diff --git a/tests/map.rs b/tests/map.rs index 9f7cd39..4337f55 100644 --- a/tests/map.rs +++ b/tests/map.rs @@ -1,5 +1,7 @@ use maraiah::{durandal::{bin, fixed::*}, marathon::{map, trm}}; +include!("data/rand.rs"); + #[test] fn read_term_must_process() { @@ -24,6 +26,14 @@ fn read_term_must_process() } } +#[test] +fn trm_must_not_process() +{ + for inp in &RANDOM { + assert!(bin::rd_array(inp, trm::read_term).is_err()); + } +} + #[test] fn read_minf_must_process() { @@ -49,4 +59,39 @@ fn read_epnt_must_process() assert_eq!(bin::rd_array(INPUT, map::read_epnt).unwrap(), OUTPUT.to_vec()); } +#[test] +fn map_must_not_process() +{ + // these functions must not succeed + for inp in &RANDOM { + assert!(map::read_minf(inp).is_err()); + assert!(map::read_old_minf(inp).is_err()); + assert!(bin::rd_array(inp, map::read_lins).is_err()); + assert!(bin::rd_array(inp, map::read_lite).is_err()); + assert!(bin::rd_array(inp, map::read_medi).is_err()); + assert!(bin::rd_array(inp, map::read_note).is_err()); + assert!(bin::rd_array(inp, map::read_objs).is_err()); + assert!(bin::rd_array(inp, map::read_plat).is_err()); + assert!(bin::rd_array(inp, map::read_poly).is_err()); + assert!(bin::rd_array(inp, map::read_sids).is_err()); + assert!(bin::rd_array(inp, map::read_old_lite).is_err()); + assert!(bin::rd_array(inp, map::read_old_poly).is_err()); + assert!(bin::rd_array(inp, map::read_old_sids).is_err()); + } +} + +#[test] +#[allow(unused_must_use)] +fn map_wont_panic() +{ + // these functions can succeed but must never panic + for inp in &RANDOM { + bin::rd_array(inp, map::read_ambi); + bin::rd_array(inp, map::read_bonk); + bin::rd_array(inp, map::read_epnt); + bin::rd_array(inp, map::read_iidx); + bin::rd_array(inp, map::read_plac); + } +} + // EOF diff --git a/tests/misc.rs b/tests/misc.rs index 62944d4..14be221 100644 --- a/tests/misc.rs +++ b/tests/misc.rs @@ -1,7 +1,9 @@ use maraiah::{durandal::image::Color8, marathon::{machdr, pict}}; +include!("data/rand.rs"); + #[test] -fn get_clut_must_process_this() +fn get_clut_must_process() { const INPUT: &[u8] = include_bytes!("data/clut.in"); const OUTPUT: [Color8; 256] = include!("data/clut.out"); @@ -10,14 +12,32 @@ fn get_clut_must_process_this() } #[test] -fn macbin_must_process_this() +fn get_clut_must_not_process() +{ + for inp in &RANDOM { + assert!(pict::get_clut(inp).is_err()); + } +} + +#[test] +fn machdr_must_process() { const INPUT: &[u8] = include_bytes!("data/macbin.in"); assert_eq!(machdr::check_macbin(INPUT), Some(128)); assert_eq!(machdr::try_mac_header(INPUT), 128); + + // TODO: missing test data for applesingle } -// TODO: missing test data for applesingle +#[test] +fn machdr_must_not_process() +{ + for inp in &RANDOM { + assert_eq!(machdr::check_macbin(inp), None); + assert_eq!(machdr::check_apple_single(inp), None); + assert_eq!(machdr::try_mac_header(inp), 0); + } +} // EOF