From ce99ad8e8e5260f3a8bac896e14faf54f0df6c58 Mon Sep 17 00:00:00 2001 From: iximeow Date: Tue, 28 Sep 2021 19:48:39 -0700 Subject: fix various armv8 and armv8 panics that should be Err. in fact the decoder should _never_ panic. included here are tests that cover the entire 32-bit instruction space and ensure that decoding and display do not panic. these tests run uncomfortably slowly (1168s to decode the 4b "instruction" sequences on my desktop), but verify that panics are no longer an issue. --- test/armv7.rs | 5 +++++ test/armv7/thumb.rs | 5 +++++ test/armv8/a64.rs | 7 +++++++ test/test.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) (limited to 'test') diff --git a/test/armv7.rs b/test/armv7.rs index 7feb774..a60b50a 100644 --- a/test/armv7.rs +++ b/test/armv7.rs @@ -106,6 +106,11 @@ fn test_display(data: [u8; 4], expected: &'static str) { } #[test] +fn test_unpredictable_instructions() { + test_invalid([0x00, 0x02, 0x08, 0x01]); // msr with invalid machine register +} + +#[test] fn test_decode_str_ldr() { test_decode( [0x24, 0xc0, 0x9f, 0xe5], diff --git a/test/armv7/thumb.rs b/test/armv7/thumb.rs index fafc65c..c74da37 100644 --- a/test/armv7/thumb.rs +++ b/test/armv7/thumb.rs @@ -77,6 +77,11 @@ fn test_display(data: &[u8], expected: &'static str) { } #[test] +fn test_unpredictable_instructions() { + test_invalid(&[0x80, 0xfa, 0x40, 0x00]); +} + +#[test] fn test_decode_add_cases() { test_display( &[0x01, 0x44], diff --git a/test/armv8/a64.rs b/test/armv8/a64.rs index 6dd9d9b..0e25c93 100644 --- a/test/armv8/a64.rs +++ b/test/armv8/a64.rs @@ -45,6 +45,13 @@ fn test_neon() { } #[test] +fn test_unpredictable() { + // could be stx/ldx but Lo1 is `x1` and invalid. + test_err([0x00, 0x00, 0x20, 0x08], DecodeError::InvalidOpcode); + test_err([0x00, 0xfc, 0x00, 0x12], DecodeError::InvalidOperand); +} + +#[test] fn test_display_misc() { test_display( [0xc0, 0x03, 0x5f, 0xd6], diff --git a/test/test.rs b/test/test.rs index fcf680a..b333fc1 100644 --- a/test/test.rs +++ b/test/test.rs @@ -7,3 +7,44 @@ extern crate yaxpeax_arm; mod armv7; mod armv8; + +use yaxpeax_arch::{Arch, Decoder, Reader, U8Reader}; +use std::fmt; + +#[test] +fn test_armv7_does_not_panic() { + let armv7 = ::Decoder::default(); + + for i in 0..=u32::MAX { + let bytes = i.to_le_bytes(); + let res = armv7.decode(&mut U8Reader::new(&bytes)); + if let Ok(instr) = res { + let s = instr.to_string(); + } + } +} +#[test] +fn test_armv7_thumb_does_not_panic() { + let mut armv7_t = ::Decoder::default(); + armv7_t.set_thumb_mode(true); + + for i in 0..=u32::MAX { + let bytes = i.to_le_bytes(); + let res = armv7_t.decode(&mut U8Reader::new(&bytes)); + if let Ok(instr) = res { + let s = instr.to_string(); + } + } +} +#[test] +fn test_armv8_does_not_panic() { + let armv8 = ::Decoder::default(); + + for i in 0..=u32::MAX { + let bytes = i.to_le_bytes(); + let res = armv8.decode(&mut U8Reader::new(&bytes)); + if let Ok(instr) = res { + let s = instr.to_string(); + } + } +} -- cgit v1.1