diff options
| author | Ulf Lilleengen <[email protected]> | 2023-06-19 22:37:23 +0200 |
|---|---|---|
| committer | Ulf Lilleengen <[email protected]> | 2023-06-19 22:39:00 +0200 |
| commit | 76659d9003104f8edd2472a36149565e4a55c0e6 (patch) | |
| tree | 9bbfca44bc301294c2021f6d18fd765b96382656 /embassy-boot/boot/src/lib.rs | |
| parent | 3c70f799a28f5f28d84fa8ee8b4b232f5e9aad82 (diff) | |
Prevent accidental revert when using firmware updater
This change prevents accidentally overwriting the previous firmware before
the new one has been marked as booted.
Diffstat (limited to 'embassy-boot/boot/src/lib.rs')
| -rw-r--r-- | embassy-boot/boot/src/lib.rs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/embassy-boot/boot/src/lib.rs b/embassy-boot/boot/src/lib.rs index 45a87bd0e..016362b86 100644 --- a/embassy-boot/boot/src/lib.rs +++ b/embassy-boot/boot/src/lib.rs | |||
| @@ -51,6 +51,8 @@ impl<const N: usize> AsMut<[u8]> for AlignedBuffer<N> { | |||
| 51 | 51 | ||
| 52 | #[cfg(test)] | 52 | #[cfg(test)] |
| 53 | mod tests { | 53 | mod tests { |
| 54 | #![allow(unused_imports)] | ||
| 55 | |||
| 54 | use embedded_storage::nor_flash::{NorFlash, ReadNorFlash}; | 56 | use embedded_storage::nor_flash::{NorFlash, ReadNorFlash}; |
| 55 | #[cfg(feature = "nightly")] | 57 | #[cfg(feature = "nightly")] |
| 56 | use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash; | 58 | use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash; |
| @@ -120,9 +122,13 @@ mod tests { | |||
| 120 | dfu: flash.dfu(), | 122 | dfu: flash.dfu(), |
| 121 | state: flash.state(), | 123 | state: flash.state(), |
| 122 | }); | 124 | }); |
| 123 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | 125 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); |
| 124 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 126 | block_on(updater.mark_updated(&mut aligned)).unwrap(); |
| 125 | 127 | ||
| 128 | // Writing after marking updated is not allowed until marked as booted. | ||
| 129 | let res: Result<(), FirmwareUpdaterError> = block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)); | ||
| 130 | assert!(matches!(res, Err::<(), _>(FirmwareUpdaterError::BadState))); | ||
| 131 | |||
| 126 | let flash = flash.into_blocking(); | 132 | let flash = flash.into_blocking(); |
| 127 | let mut bootloader = BootLoader::new(BootLoaderConfig { | 133 | let mut bootloader = BootLoader::new(BootLoaderConfig { |
| 128 | active: flash.active(), | 134 | active: flash.active(), |
| @@ -188,7 +194,7 @@ mod tests { | |||
| 188 | dfu: flash.dfu(), | 194 | dfu: flash.dfu(), |
| 189 | state: flash.state(), | 195 | state: flash.state(), |
| 190 | }); | 196 | }); |
| 191 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | 197 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); |
| 192 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 198 | block_on(updater.mark_updated(&mut aligned)).unwrap(); |
| 193 | 199 | ||
| 194 | let flash = flash.into_blocking(); | 200 | let flash = flash.into_blocking(); |
| @@ -230,7 +236,7 @@ mod tests { | |||
| 230 | dfu: flash.dfu(), | 236 | dfu: flash.dfu(), |
| 231 | state: flash.state(), | 237 | state: flash.state(), |
| 232 | }); | 238 | }); |
| 233 | block_on(updater.write_firmware(0, &UPDATE)).unwrap(); | 239 | block_on(updater.write_firmware(&mut aligned, 0, &UPDATE)).unwrap(); |
| 234 | block_on(updater.mark_updated(&mut aligned)).unwrap(); | 240 | block_on(updater.mark_updated(&mut aligned)).unwrap(); |
| 235 | 241 | ||
| 236 | let flash = flash.into_blocking(); | 242 | let flash = flash.into_blocking(); |
