Skip to content

Commit 62dedfc

Browse files
committed
Propagate hal_flash_write() error when writing partition magic
F/437
1 parent 397b896 commit 62dedfc

3 files changed

Lines changed: 44 additions & 0 deletions

File tree

src/libwolfboot.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ static int RAMFUNCTION partition_magic_write(uint8_t part, uintptr_t addr)
374374
XMEMCPY(NVM_CACHE, (void*)addr_read, NVM_CACHE_SIZE);
375375
XMEMCPY(NVM_CACHE + off, &wolfboot_magic_trail, sizeof(uint32_t));
376376
ret = hal_flash_write(addr_write, NVM_CACHE, WOLFBOOT_SECTOR_SIZE);
377+
if (ret != 0)
378+
return ret;
377379
nvm_cached_sector = !nvm_cached_sector;
378380
ret = hal_flash_erase(addr_read, WOLFBOOT_SECTOR_SIZE);
379381
return ret;

tools/unit-tests/unit-mock-flash.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ static int erased_swap = 0;
3131
static int erased_nvm_bank0 = 0;
3232
static int erased_nvm_bank1 = 0;
3333
static int erased_vault = 0;
34+
static int hal_flash_write_fail = 0;
3435
const char *argv0;
3536

3637
#include <sys/stat.h>
@@ -45,6 +46,10 @@ int hal_flash_write(haladdr_t address, const uint8_t *data, int len)
4546
int i;
4647
uint8_t *a = (uint8_t *)(uintptr_t)address;
4748
ck_assert_msg(!locked, "Attempting to write to a locked FLASH");
49+
if (hal_flash_write_fail) {
50+
hal_flash_write_fail = 0;
51+
return -1;
52+
}
4853
if ((address >= WOLFBOOT_PARTITION_SWAP_ADDRESS) &&
4954
(address < WOLFBOOT_PARTITION_UPDATE_ADDRESS + WOLFBOOT_SECTOR_SIZE)) {
5055
for (i = 0; i < len; i++) {

tools/unit-tests/unit-nvm.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,41 @@ START_TEST (test_nvm_select_fresh_sector)
285285
}
286286
END_TEST
287287

288+
START_TEST(test_partition_magic_write_stops_on_flash_write_error)
289+
{
290+
int ret;
291+
uint32_t *magic;
292+
293+
ret = mmap_file("/tmp/wolfboot-unit-file-error.bin", (void *)MOCK_ADDRESS,
294+
WOLFBOOT_PARTITION_SIZE, NULL);
295+
ck_assert(ret >= 0);
296+
ret = mmap_file("/tmp/wolfboot-unit-swap-error.bin", (void *)MOCK_ADDRESS_SWAP,
297+
WOLFBOOT_SECTOR_SIZE, NULL);
298+
ck_assert(ret >= 0);
299+
300+
hal_flash_unlock();
301+
wolfBoot_erase_partition(PART_UPDATE);
302+
303+
magic = get_partition_magic(PART_UPDATE);
304+
*magic = wolfboot_magic_trail;
305+
306+
erased_update = 0;
307+
erased_nvm_bank0 = 0;
308+
erased_nvm_bank1 = 0;
309+
hal_flash_write_fail = 1;
310+
311+
ret = partition_magic_write(PART_UPDATE,
312+
PART_UPDATE_ENDFLAGS - sizeof(uint32_t));
313+
ck_assert_int_eq(ret, -1);
314+
ck_assert_int_eq(erased_update, 0);
315+
ck_assert_int_eq(erased_nvm_bank0, 0);
316+
ck_assert_int_eq(erased_nvm_bank1, 0);
317+
ck_assert_uint_eq(*magic, wolfboot_magic_trail);
318+
319+
hal_flash_lock();
320+
}
321+
END_TEST
322+
288323

289324
Suite *wolfboot_suite(void)
290325
{
@@ -294,6 +329,8 @@ Suite *wolfboot_suite(void)
294329
/* Test cases */
295330
TCase *nvm_select_fresh_sector = tcase_create("NVM select fresh sector");
296331
tcase_add_test(nvm_select_fresh_sector, test_nvm_select_fresh_sector);
332+
tcase_add_test(nvm_select_fresh_sector,
333+
test_partition_magic_write_stops_on_flash_write_error);
297334
suite_add_tcase(s, nvm_select_fresh_sector);
298335

299336
return s;

0 commit comments

Comments
 (0)