diff --git a/libraries/tock-tbf/src/parse.rs b/libraries/tock-tbf/src/parse.rs index 3e0d12096d..8041cbe762 100644 --- a/libraries/tock-tbf/src/parse.rs +++ b/libraries/tock-tbf/src/parse.rs @@ -133,9 +133,7 @@ pub fn parse_tbf_header( let mut app_name_str = ""; let mut fixed_address_pointer: Option<&'static [u8]> = None; let mut permissions_pointer: Option<&'static [u8]> = None; - let mut storage_permissions_pointer: Option< - types::TbfHeaderV2StoragePermissions<8>, - > = None; + let mut storage_permissions_pointer: Option<&'static [u8]> = None; let mut kernel_version: Option = None; // Iterate the remainder of the header looking for TLV entries. @@ -242,7 +240,11 @@ pub fn parse_tbf_header( } types::TbfHeaderTypes::TbfHeaderStoragePermissions => { - storage_permissions_pointer = Some(remaining.try_into()?); + storage_permissions_pointer = Some( + remaining + .get(0..tlv_header.length as usize) + .ok_or(types::TbfParseError::NotEnoughFlash)?, + ); } types::TbfHeaderTypes::TbfHeaderKernelVersion => { diff --git a/libraries/tock-tbf/src/types.rs b/libraries/tock-tbf/src/types.rs index d312e9e880..b5b1454054 100644 --- a/libraries/tock-tbf/src/types.rs +++ b/libraries/tock-tbf/src/types.rs @@ -668,7 +668,7 @@ pub struct TbfHeaderV2 { pub(crate) writeable_regions: Option<&'static [u8]>, pub(crate) fixed_addresses: Option<&'static [u8]>, pub(crate) permissions: Option<&'static [u8]>, - pub(crate) storage_permissions: Option>, + pub(crate) storage_permissions: Option<&'static [u8]>, pub(crate) kernel_version: Option, } @@ -935,7 +935,13 @@ impl TbfHeader { pub fn get_storage_write_id(&self) -> Option { match self { TbfHeader::TbfHeaderV2(hd) => match hd.storage_permissions { - Some(permissions) => permissions.write_id, + Some(storage_permissions_tlv_slice) => { + let write_id = core::num::NonZeroU32::new(u32::from_le_bytes( + storage_permissions_tlv_slice.get(0..4)?.try_into().ok()?, + )); + + write_id + } _ => None, }, _ => None, @@ -947,7 +953,16 @@ impl TbfHeader { pub fn get_storage_read_ids(&self) -> Option<(usize, [u32; NUM_STORAGE_PERMISSIONS])> { match self { TbfHeader::TbfHeaderV2(hd) => match hd.storage_permissions { - Some(permissions) => Some((permissions.read_length.into(), permissions.read_ids)), + Some(storage_permissions_tlv_slice) => { + let storage_permissions: TbfHeaderV2StoragePermissions< + NUM_STORAGE_PERMISSIONS, + > = storage_permissions_tlv_slice.try_into().ok()?; + + Some(( + storage_permissions.read_length.into(), + storage_permissions.read_ids, + )) + } _ => None, }, _ => None, @@ -959,8 +974,15 @@ impl TbfHeader { pub fn get_storage_modify_ids(&self) -> Option<(usize, [u32; NUM_STORAGE_PERMISSIONS])> { match self { TbfHeader::TbfHeaderV2(hd) => match hd.storage_permissions { - Some(permissions) => { - Some((permissions.modify_length.into(), permissions.modify_ids)) + Some(storage_permissions_tlv_slice) => { + let storage_permissions: TbfHeaderV2StoragePermissions< + NUM_STORAGE_PERMISSIONS, + > = storage_permissions_tlv_slice.try_into().ok()?; + + Some(( + storage_permissions.modify_length.into(), + storage_permissions.modify_ids, + )) } _ => None, },