@@ -38,27 +38,31 @@ static int wolfBoot_copy_sector(struct wolfBoot_image *src, struct wolfBoot_imag
3838 if (dst -> part == PART_SWAP )
3939 dst_sector_offset = 0 ;
4040#ifdef EXT_FLASH
41+ uint8_t buffer [FLASHBUFFER_SIZE ];
4142 if (PART_IS_EXT (src )) {
42- uint8_t buffer [FLASHBUFFER_SIZE ];
4343 wb_flash_erase (dst , dst_sector_offset , WOLFBOOT_SECTOR_SIZE );
44- while (pos < WOLFBOOT_SECTOR_SIZE ) {
45- ext_flash_read ((uint32_t )(src -> hdr ) + src_sector_offset + pos , (void * )buffer , FLASHBUFFER_SIZE );
46- wb_flash_write (dst , dst_sector_offset + pos , buffer , FLASHBUFFER_SIZE );
44+ while (pos < WOLFBOOT_SECTOR_SIZE )
45+ if (src_sector_offset + pos < (src -> fw_size + IMAGE_HEADER_SIZE + FLASHBUFFER_SIZE )) {
46+ ext_flash_read ((uint32_t )(src -> hdr ) + src_sector_offset + pos , (void * )buffer , FLASHBUFFER_SIZE );
47+ wb_flash_write (dst , dst_sector_offset + pos , buffer , FLASHBUFFER_SIZE );
48+ }
4749 pos += FLASHBUFFER_SIZE ;
4850 }
4951 return pos ;
5052 }
5153#endif
5254 wb_flash_erase (dst , dst_sector_offset , WOLFBOOT_SECTOR_SIZE );
5355 while (pos < WOLFBOOT_SECTOR_SIZE ) {
54- uint8_t * orig = (uint8_t * )(src -> hdr + src_sector_offset + pos );
55- wb_flash_write (dst , dst_sector_offset + pos , orig , FLASHBUFFER_SIZE );
56+ if (src_sector_offset + pos < (src -> fw_size + IMAGE_HEADER_SIZE + FLASHBUFFER_SIZE )) {
57+ uint8_t * orig = (uint8_t * )(src -> hdr + src_sector_offset + pos );
58+ wb_flash_write (dst , dst_sector_offset + pos , orig , FLASHBUFFER_SIZE );
59+ }
5660 pos += FLASHBUFFER_SIZE ;
5761 }
5862 return pos ;
5963}
6064
61- static int wolfBoot_update (void )
65+ static int wolfBoot_update (int fallback_allowed )
6266{
6367 uint32_t total_size = 0 ;
6468 const uint32_t sector_size = WOLFBOOT_SECTOR_SIZE ;
@@ -91,7 +95,8 @@ static int wolfBoot_update(void)
9195 return -1 ;
9296 }
9397#ifndef ALLOW_DOWNGRADE
94- if (wolfBoot_update_firmware_version () <= wolfBoot_current_firmware_version ())
98+ if ( !fallback_allowed &&
99+ (wolfBoot_update_firmware_version () <= wolfBoot_current_firmware_version ()) )
95100 return -1 ;
96101#endif
97102 }
@@ -109,23 +114,26 @@ static int wolfBoot_update(void)
109114 if ((wolfBoot_get_sector_flag (PART_UPDATE , sector , & flag ) != 0 ) || (flag == SECT_FLAG_NEW )) {
110115 flag = SECT_FLAG_SWAPPING ;
111116 wolfBoot_copy_sector (& update , & swap , sector );
112- wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
117+ if (((sector + 1 ) * sector_size ) < WOLFBOOT_PARTITION_SIZE )
118+ wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
113119 }
114120 if (flag == SECT_FLAG_SWAPPING ) {
115121 uint32_t size = total_size - (sector * sector_size );
116122 if (size > sector_size )
117123 size = sector_size ;
118124 flag = SECT_FLAG_BACKUP ;
119125 wolfBoot_copy_sector (& boot , & update , sector );
120- wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
126+ if (((sector + 1 ) * sector_size ) < WOLFBOOT_PARTITION_SIZE )
127+ wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
121128 }
122129 if (flag == SECT_FLAG_BACKUP ) {
123130 uint32_t size = total_size - (sector * sector_size );
124131 if (size > sector_size )
125132 size = sector_size ;
126133 flag = SECT_FLAG_UPDATED ;
127134 wolfBoot_copy_sector (& swap , & boot , sector );
128- wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
135+ if (((sector + 1 ) * sector_size ) < WOLFBOOT_PARTITION_SIZE )
136+ wolfBoot_set_sector_flag (PART_UPDATE , sector , flag );
129137 }
130138 sector ++ ;
131139 }
@@ -149,15 +157,15 @@ static void wolfBoot_start(void)
149157 uint8_t st ;
150158 struct wolfBoot_image boot , update ;
151159 if ((wolfBoot_get_partition_state (PART_UPDATE , & st ) == 0 ) && (st == IMG_STATE_UPDATING )) {
152- wolfBoot_update ();
160+ wolfBoot_update (0 );
153161 } else if ((wolfBoot_get_partition_state (PART_BOOT , & st ) == 0 ) && (st == IMG_STATE_TESTING )) {
154162 wolfBoot_update_trigger ();
155- wolfBoot_update ();
163+ wolfBoot_update (1 );
156164 }
157165 if ((wolfBoot_open_image (& boot , PART_BOOT ) < 0 ) ||
158166 (wolfBoot_verify_integrity (& boot ) < 0 ) ||
159167 (wolfBoot_verify_authenticity (& boot ) < 0 )) {
160- if (wolfBoot_update () < 0 ) {
168+ if (wolfBoot_update (1 ) < 0 ) {
161169 while (1 )
162170 /* panic */ ;
163171 }
0 commit comments