@@ -319,6 +319,8 @@ fd_sbpf_load_shdrs( fd_sbpf_elf_info_t * info,
319
319
ulong vsegment_end = 0UL ; /* Upper bound of segment virtual address */
320
320
321
321
ulong tot_section_sz = 0UL ; /* Size of all sections */
322
+ ulong lowest_addr = 0UL ;
323
+ ulong highest_addr = 0UL ;
322
324
323
325
for ( ulong i = 0UL ; i < sht_cnt ; i ++ ) {
324
326
uint sh_type = shdr [ i ].sh_type ;
@@ -368,6 +370,15 @@ fd_sbpf_load_shdrs( fd_sbpf_elf_info_t * info,
368
370
/* TODO switch table for this? */
369
371
/* TODO reject duplicate sections */
370
372
373
+ /* https://github.com/firedancer-io/sbpf/blob/sbpf-v0.11.1-patches/src/elf.rs#L855 */
374
+ if ( FD_LIKELY ( strncmp ( name , ".text" , 5UL )== 0 ||
375
+ strncmp ( name , ".rodata" , 7UL )== 0 ||
376
+ strncmp ( name , ".data.rel.ro" , 12UL )== 0 ||
377
+ strncmp ( name , ".eh_frame" , 8UL )== 0 ) ) {
378
+ lowest_addr = fd_ulong_min ( lowest_addr , sh_addr );
379
+ highest_addr = fd_ulong_max ( highest_addr , fd_ulong_sat_add ( sh_addr , sh_size ) );
380
+ }
381
+
371
382
int load = 0 ; /* should section be loaded? */
372
383
373
384
/**/ if ( 0 == memcmp ( name , ".text" , 6UL /* equals */ ) ) {
@@ -439,6 +450,9 @@ fd_sbpf_load_shdrs( fd_sbpf_elf_info_t * info,
439
450
}
440
451
}
441
452
453
+ /* https://github.com/firedancer-io/sbpf/blob/sbpf-v0.11.1-patches/src/elf.rs#L982 */
454
+ REQUIRE ( fd_ulong_sat_sub ( highest_addr , lowest_addr ) <= elf_sz ); /* addr out of bounds */
455
+
442
456
/* More coherence checks */
443
457
REQUIRE ( psegment_end <= elf_sz ); // https://github.com/solana-labs/rbpf/blob/v0.8.0/src/elf.rs#L782
444
458
0 commit comments