From cc6ce1c625d6390bd26255a05bd09053c66a27cc Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Mon, 4 Sep 2023 15:06:34 +0200 Subject: [PATCH] fix value serialization and add test for boolean value for regression --- androscalpel/src/apk.rs | 4 ++-- androscalpel_serializer/src/value.rs | 34 ++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/androscalpel/src/apk.rs b/androscalpel/src/apk.rs index a48c39e..5cf9852 100644 --- a/androscalpel/src/apk.rs +++ b/androscalpel/src/apk.rs @@ -90,7 +90,7 @@ impl Apk { static_fields = self.get_field_list_from_dex(&data.static_fields, dex)?; instance_fields = self.get_field_list_from_dex(&data.instance_fields, dex)?; } - /* + if class_item.static_values_off != 0 { let values = dex .get_struct_at_offset::(class_item.static_values_off)? @@ -109,7 +109,7 @@ impl Apk { for field in static_fields.iter_mut().skip(values.len()) { field.value = None; } - }*/ + } Ok(Class { name, superclass, diff --git a/androscalpel_serializer/src/value.rs b/androscalpel_serializer/src/value.rs index 3a89b8f..2fc09fb 100644 --- a/androscalpel_serializer/src/value.rs +++ b/androscalpel_serializer/src/value.rs @@ -250,7 +250,7 @@ impl Serializable for EncodedValue { })?; let [byte] = buffer; let arg = (byte & 0b1110_0000) >> 5; - match ValueType(byte & 0b0011_1111) { + match ValueType(byte & 0b0001_1111) { VALUE_BYTE => { if arg != 0 { Err(Error::DeserializationError(format!( @@ -669,4 +669,34 @@ impl Serializable for Idx { } } -// TODO: TESTS!!! +// TODO: more TESTS!!! + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn boolean_deserialize() { + assert_eq!( + EncodedValue::deserialize_from_slice(&[0b0001_1111]).unwrap(), + EncodedValue::Boolean(false) + ); + assert_eq!( + EncodedValue::deserialize_from_slice(&[0b0011_1111]).unwrap(), + EncodedValue::Boolean(true) + ); + assert!(EncodedValue::deserialize_from_slice(&[0b0101_1111]).is_err()); + } + + #[test] + fn boolean_serialize() { + assert_eq!( + EncodedValue::Boolean(false).serialize_to_vec().unwrap(), + vec![0b0001_1111] + ); + assert_eq!( + EncodedValue::Boolean(true).serialize_to_vec().unwrap(), + vec![0b0011_1111] + ); + } +}