Skip to content

Commit

Permalink
lib: tbf: storage_perms delay parse
Browse files Browse the repository at this point in the history
  • Loading branch information
bradjc committed Mar 6, 2024
1 parent 0bd91f4 commit 30d140e
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 9 deletions.
10 changes: 6 additions & 4 deletions libraries/tock-tbf/src/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<types::TbfHeaderV2KernelVersion> = None;

// Iterate the remainder of the header looking for TLV entries.
Expand Down Expand Up @@ -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 => {
Expand Down
32 changes: 27 additions & 5 deletions libraries/tock-tbf/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<TbfHeaderV2StoragePermissions<NUM_STORAGE_PERMISSIONS>>,
pub(crate) storage_permissions: Option<&'static [u8]>,
pub(crate) kernel_version: Option<TbfHeaderV2KernelVersion>,
}

Expand Down Expand Up @@ -935,7 +935,13 @@ impl TbfHeader {
pub fn get_storage_write_id(&self) -> Option<core::num::NonZeroU32> {
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,
Expand All @@ -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,
Expand All @@ -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,
},
Expand Down

0 comments on commit 30d140e

Please sign in to comment.