@@ -861,51 +861,74 @@ void RAMFUNCTION wolfBoot_success(void)
861861 */
862862uint16_t wolfBoot_find_header (uint8_t * haystack , uint16_t type , uint8_t * * ptr )
863863{
864- uint8_t * p = haystack ;
864+ uint8_t * p ;
865865 uint16_t len , htype ;
866- const volatile uint8_t * max_p = ( haystack - IMAGE_HEADER_OFFSET ) +
867- IMAGE_HEADER_SIZE ;
866+ uintptr_t p_addr , max_addr ;
867+
868868 * ptr = NULL ;
869- if (p > max_p ) {
869+
870+ if (haystack == NULL ) {
871+ unit_dbg ("Illegal address (NULL)\n" );
872+ return 0 ;
873+ }
874+
875+ p_addr = (uintptr_t )haystack ;
876+ if (p_addr < IMAGE_HEADER_OFFSET ) {
877+ unit_dbg ("Illegal address (too low)\n" );
878+ return 0 ;
879+ }
880+
881+ max_addr = p_addr - IMAGE_HEADER_OFFSET ;
882+ if (max_addr > (UINTPTR_MAX - IMAGE_HEADER_SIZE )) {
883+ unit_dbg ("Illegal address (overflow)\n" );
884+ return 0 ;
885+ }
886+ max_addr += IMAGE_HEADER_SIZE ;
887+
888+ if (p_addr > max_addr ) {
870889 unit_dbg ("Illegal address (too high)\n" );
871890 return 0 ;
872891 }
873- while ((p + 4 ) < max_p ) {
892+
893+ while (p_addr < max_addr ) {
894+ if ((max_addr - p_addr ) < 4U ) {
895+ break ;
896+ }
897+ p = (uint8_t * )p_addr ;
874898 htype = p [0 ] | (p [1 ] << 8 );
875899 if (htype == 0 ) {
876900 unit_dbg ("Explicit end of options reached\n" );
877901 break ;
878902 }
879903 /* skip unaligned half-words and padding bytes */
880- if ((p [0 ] == HDR_PADDING ) || (((( size_t ) p ) & 0x01 ) != 0 )) {
881- p ++ ;
904+ if ((p [0 ] == HDR_PADDING ) || ((p_addr & 0x01U ) != 0U )) {
905+ p_addr ++ ;
882906 continue ;
883907 }
884908
885909 len = p [2 ] | (p [3 ] << 8 );
886910 /* check len */
887- if ((4 + len ) > (uint16_t )(IMAGE_HEADER_SIZE - IMAGE_HEADER_OFFSET )) {
911+ if ((4U + len ) > (uint16_t )(IMAGE_HEADER_SIZE - IMAGE_HEADER_OFFSET )) {
888912 unit_dbg ("This field is too large (bigger than the space available "
889913 "in the current header)\n" );
890- unit_dbg ("%d %d %d\n" , len , IMAGE_HEADER_SIZE , IMAGE_HEADER_OFFSET );
914+ unit_dbg ("%u %u %u\n" , (unsigned int )len ,
915+ (unsigned int )IMAGE_HEADER_SIZE ,
916+ (unsigned int )IMAGE_HEADER_OFFSET );
891917 break ;
892918 }
893919 /* check max pointer */
894- if (p + 4 + len > max_p ) {
920+ if (( max_addr - p_addr ) < ( uintptr_t )( 4U + len ) ) {
895921 unit_dbg ("This field is too large and would overflow the image "
896922 "header\n" );
897923 break ;
898924 }
899925
900- /* skip header [type|len] */
901- p += 4 ;
902-
903926 if (htype == type ) {
904927 /* found, return pointer to data portion */
905- * ptr = p ;
928+ * ptr = ( uint8_t * )( p_addr + 4U ) ;
906929 return len ;
907930 }
908- p += len ;
931+ p_addr += ( uintptr_t )( 4U + len ) ;
909932 }
910933 return 0 ;
911934}
0 commit comments