957: Take into account size of revert index r=lulf a=lulf

Fixes a bug in the partition assertions that ensures that the state page(s) have enough space for 2x active partition range.

Add unit test to verify that panic is observed.

Co-authored-by: Ulf Lilleengen <ulf.lilleengen@gmail.com>
This commit is contained in:
bors[bot] 2022-09-20 12:56:46 +00:00 committed by GitHub
commit 44d7a84e47
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -222,10 +222,7 @@ impl BootLoader {
page: &mut [u8], page: &mut [u8],
) -> Result<State, BootError> { ) -> Result<State, BootError> {
// Ensure we have enough progress pages to store copy progress // Ensure we have enough progress pages to store copy progress
assert_eq!(self.active.len() % page.len(), 0); assert_partitions(self.active, self.dfu, self.state, page.len(), P::STATE::WRITE_SIZE);
assert_eq!(self.dfu.len() % page.len(), 0);
assert!(self.dfu.len() - self.active.len() >= page.len());
assert!(self.active.len() / page.len() <= (self.state.len() - P::STATE::WRITE_SIZE) / P::STATE::WRITE_SIZE);
assert_eq!(magic.len(), P::STATE::WRITE_SIZE); assert_eq!(magic.len(), P::STATE::WRITE_SIZE);
// Copy contents from partition N to active // Copy contents from partition N to active
@ -409,6 +406,13 @@ impl BootLoader {
} }
} }
fn assert_partitions(active: Partition, dfu: Partition, state: Partition, page_size: usize, write_size: usize) {
assert_eq!(active.len() % page_size, 0);
assert_eq!(dfu.len() % page_size, 0);
assert!(dfu.len() - active.len() >= page_size);
assert!(2 * (active.len() / page_size) <= (state.len() - write_size) / write_size);
}
/// Convenience provider that uses a single flash for all partitions. /// Convenience provider that uses a single flash for all partitions.
pub struct SingleFlashConfig<'a, F> pub struct SingleFlashConfig<'a, F>
where where
@ -919,6 +923,15 @@ mod tests {
} }
} }
#[test]
#[should_panic]
fn test_range_asserts() {
const ACTIVE: Partition = Partition::new(4096, 4194304);
const DFU: Partition = Partition::new(4194304, 2 * 4194304);
const STATE: Partition = Partition::new(0, 4096);
assert_partitions(ACTIVE, DFU, STATE, 4096, 4);
}
struct MemFlash<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize>([u8; SIZE]); struct MemFlash<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize>([u8; SIZE]);
impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> NorFlash impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> NorFlash