Skip to content

Commit 80f9e99

Browse files
authored
Merge pull request #573 from danielinux/update-trigger-doublewrite-fix
wolfBoot_update_trigger: Fix double-write-after-erase in NVM...WRITEONCE
2 parents 4b93736 + 9e8ed90 commit 80f9e99

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

src/libwolfboot.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,17 +752,27 @@ void RAMFUNCTION wolfBoot_update_trigger(void)
752752
* FLAGS_INVERT needs erased flags because the bin-assemble's fill byte may
753753
* not match what's in wolfBoot */
754754
if (FLAGS_UPDATE_EXT()) {
755-
ext_flash_erase(lastSector, SECTOR_FLAGS_SIZE);
755+
ext_flash_erase(lastSector, WOLFBOOT_SECTOR_SIZE);
756+
wolfBoot_set_partition_state(PART_UPDATE, st);
756757
} else {
757758
#ifndef NVM_FLASH_WRITEONCE
758-
hal_flash_erase(lastSector, SECTOR_FLAGS_SIZE);
759+
hal_flash_erase(lastSector, WOLFBOOT_SECTOR_SIZE);
760+
wolfBoot_set_partition_state(PART_UPDATE, st);
759761
#else
762+
uint32_t magic = WOLFBOOT_MAGIC_TRAIL;
763+
uint32_t offset = SECTOR_FLAGS_SIZE;
764+
#ifdef FLAGS_HOME
765+
offset -= (PART_BOOT_ENDFLAGS - PART_UPDATE_ENDFLAGS);
766+
#endif
760767
selSec = nvm_select_fresh_sector(PART_UPDATE);
761768
XMEMCPY(NVM_CACHE, (uint8_t*)lastSector - WOLFBOOT_SECTOR_SIZE * selSec,
762769
WOLFBOOT_SECTOR_SIZE);
763770
/* write to the non selected sector */
764771
hal_flash_erase(lastSector - WOLFBOOT_SECTOR_SIZE * !selSec,
765772
WOLFBOOT_SECTOR_SIZE);
773+
774+
NVM_CACHE[offset] = IMG_STATE_UPDATING;
775+
memcpy(NVM_CACHE + offset + 1, &magic, sizeof(uint32_t));
766776
hal_flash_write(lastSector - WOLFBOOT_SECTOR_SIZE * !selSec, NVM_CACHE,
767777
WOLFBOOT_SECTOR_SIZE);
768778
/* erase the previously selected sector */
@@ -771,7 +781,6 @@ void RAMFUNCTION wolfBoot_update_trigger(void)
771781
#endif
772782
}
773783

774-
wolfBoot_set_partition_state(PART_UPDATE, st);
775784

776785
if (FLAGS_UPDATE_EXT()) {
777786
ext_flash_lock();

tools/unit-tests/unit-enc-nvm.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#define MOCK_ADDRESS_SWAP 0xCE000000
2828
const char ENCRYPT_KEY[] = "0123456789abcdef0123456789abcdef0123456789abcdef";
2929
#include <stdio.h>
30+
#include "image.h"
3031
#include "encrypt.h"
3132
#include "libwolfboot.c"
3233
#include <fcntl.h>
@@ -274,10 +275,10 @@ START_TEST (test_nvm_update_with_encryption)
274275
/* Triggering update to set flags */
275276
wolfBoot_update_trigger();
276277

277-
/* Current selected should now be 0 */
278+
/* Current selected should now be 1 */
278279
ret = nvm_select_fresh_sector(PART_UPDATE);
279-
ck_assert_msg(ret == 0, "Failed to select updating fresh sector\n");
280-
ck_assert_msg(erased_nvm_bank1 != 0, "Did not erase the non-selected bank");
280+
ck_assert_msg(ret == 1, "Failed to select updating fresh sector\n");
281+
ck_assert_msg(erased_nvm_bank0 != 0, "Did not erase the non-selected bank");
281282

282283
magic = get_partition_magic(PART_UPDATE);
283284
ck_assert_msg(*magic == *boot_word,

tools/unit-tests/unit-nvm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,10 @@ START_TEST (test_nvm_select_fresh_sector)
269269
/* Triggering update to set flags */
270270
wolfBoot_update_trigger();
271271

272-
/* Current selected should now be 0 */
272+
/* Current selected should now be 1 */
273273
ret = nvm_select_fresh_sector(PART_UPDATE);
274-
ck_assert_msg(ret == 0, "Failed to select updating fresh sector\n");
275-
ck_assert_msg(erased_nvm_bank1 > 0, "Did not erase the non-selected bank");
274+
ck_assert_msg(ret == 1, "Failed to select updating fresh sector\n");
275+
ck_assert_msg(erased_nvm_bank0 > 0, "Did not erase the non-selected bank");
276276

277277
magic = get_partition_magic(PART_UPDATE);
278278
ck_assert_msg(*magic == *boot_word,

0 commit comments

Comments
 (0)