Skip to content

Commit 015250f

Browse files
authored
Feature gates for rbpf v0.2.16 (solana-labs#21590)
- Adds feature reject_section_virtual_address_file_offset_mismatch. - Adds feature start_verify_shift32_imm. - Enables enable_symbol_and_section_labels only in the rbpf-cli.
1 parent a9d5ef2 commit 015250f

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

cli/src/program.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,9 @@ fn read_and_verify_elf(program_location: &str) -> Result<Vec<u8>, Box<dyn std::e
19991999
Some(verifier::check),
20002000
Config {
20012001
reject_unresolved_syscalls: true,
2002-
verify_mul64_imm_nonzero: true, // TODO: Remove me after feature gate
2002+
verify_mul64_imm_nonzero: false,
2003+
verify_shift32_imm: true,
2004+
reject_section_virtual_address_file_offset_mismatch: true,
20032005
..Config::default()
20042006
},
20052007
register_syscalls(&mut invoke_context).unwrap(),

programs/bpf/tests/programs.rs

+4
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,10 @@ fn run_program(name: &str) -> u64 {
209209
let mut instruction_meter = ThisInstructionMeter { compute_meter };
210210
let config = Config {
211211
enable_instruction_tracing: true,
212+
reject_unresolved_syscalls: true,
213+
reject_section_virtual_address_file_offset_mismatch: true,
214+
verify_mul64_imm_nonzero: false,
215+
verify_shift32_imm: true,
212216
..Config::default()
213217
};
214218
let mut executable = Executable::<BpfError, ThisInstructionMeter>::from_elf(

programs/bpf_loader/src/lib.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ use solana_sdk::{
3838
entrypoint::{HEAP_LENGTH, SUCCESS},
3939
feature_set::{
4040
do_support_realloc, reduce_required_deploy_balance,
41-
reject_deployment_of_unresolved_syscalls, requestable_heap_size,
42-
stop_verify_mul64_imm_nonzero,
41+
reject_deployment_of_unresolved_syscalls,
42+
reject_section_virtual_address_file_offset_mismatch, requestable_heap_size,
43+
start_verify_shift32_imm, stop_verify_mul64_imm_nonzero,
4344
},
4445
instruction::{AccountMeta, InstructionError},
4546
keyed_account::{from_keyed_account, keyed_account_at_index, KeyedAccount},
@@ -79,7 +80,7 @@ pub fn create_executor(
7980
programdata_offset: usize,
8081
invoke_context: &mut InvokeContext,
8182
use_jit: bool,
82-
reject_unresolved_syscalls: bool,
83+
reject_deployment_of_broken_elfs: bool,
8384
) -> Result<Arc<BpfExecutor>, InstructionError> {
8485
let syscall_registry = syscalls::register_syscalls(invoke_context).map_err(|e| {
8586
ic_msg!(invoke_context, "Failed to register syscalls: {}", e);
@@ -90,13 +91,20 @@ pub fn create_executor(
9091
max_call_depth: compute_budget.max_call_depth,
9192
stack_frame_size: compute_budget.stack_frame_size,
9293
enable_instruction_tracing: log_enabled!(Trace),
93-
reject_unresolved_syscalls: reject_unresolved_syscalls
94+
reject_unresolved_syscalls: reject_deployment_of_broken_elfs
9495
&& invoke_context
9596
.feature_set
9697
.is_active(&reject_deployment_of_unresolved_syscalls::id()),
98+
reject_section_virtual_address_file_offset_mismatch: reject_deployment_of_broken_elfs
99+
&& invoke_context
100+
.feature_set
101+
.is_active(&reject_section_virtual_address_file_offset_mismatch::id()),
97102
verify_mul64_imm_nonzero: !invoke_context
98103
.feature_set
99-
.is_active(&stop_verify_mul64_imm_nonzero::id()), // TODO: Feature gate and then remove me
104+
.is_active(&stop_verify_mul64_imm_nonzero::id()),
105+
verify_shift32_imm: invoke_context
106+
.feature_set
107+
.is_active(&start_verify_shift32_imm::id()),
100108
..Config::default()
101109
};
102110
let mut executable = {

rbpf-cli/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ native machine code before execting it in the virtual machine.",
152152

153153
let config = Config {
154154
enable_instruction_tracing: matches.is_present("trace") || matches.is_present("profile"),
155+
enable_symbol_and_section_labels: true,
155156
..Config::default()
156157
};
157158
let loader_id = bpf_loader::id();

sdk/src/feature_set.rs

+10
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ pub mod stop_verify_mul64_imm_nonzero {
139139
solana_sdk::declare_id!("EHFwHg2vhwUb7ifm7BuY9RMbsyt1rS1rUii7yeDJtGnN");
140140
}
141141

142+
pub mod start_verify_shift32_imm {
143+
solana_sdk::declare_id!("CqvdhqAYMc6Eq6tjW3H42Qg39TK2SCsL8ydMsC363PRp");
144+
}
145+
142146
pub mod merge_nonce_error_into_system_error {
143147
solana_sdk::declare_id!("21AWDosvp3pBamFW91KB35pNoaoZVTM7ess8nr2nt53B");
144148
}
@@ -237,6 +241,10 @@ pub mod reject_deployment_of_unresolved_syscalls {
237241
solana_sdk::declare_id!("DqniU3MfvdpU3yhmNF1RKeaM5TZQELZuyFGosASRVUoy");
238242
}
239243

244+
pub mod reject_section_virtual_address_file_offset_mismatch {
245+
solana_sdk::declare_id!("5N4NikcJLEiZNqwndhNyvZw15LvFXp1oF7AJQTNTZY5k");
246+
}
247+
240248
pub mod nonce_must_be_writable {
241249
solana_sdk::declare_id!("BiCU7M5w8ZCMykVSyhZ7Q3m2SWoR2qrEQ86ERcDX77ME");
242250
}
@@ -279,6 +287,7 @@ lazy_static! {
279287
(tx_wide_compute_cap::id(), "transaction wide compute cap"),
280288
(spl_token_v2_set_authority_fix::id(), "spl-token set_authority fix"),
281289
(stop_verify_mul64_imm_nonzero::id(), "sets rbpf vm config verify_mul64_imm_nonzero to false"),
290+
(start_verify_shift32_imm::id(), "sets rbpf vm config verify_shift32_imm to true"),
282291
(merge_nonce_error_into_system_error::id(), "merge NonceError into SystemError"),
283292
(disable_fees_sysvar::id(), "disable fees sysvar"),
284293
(stake_merge_with_unmatched_credits_observed::id(), "allow merging active stakes with unmatched credits_observed #18985"),
@@ -303,6 +312,7 @@ lazy_static! {
303312
(disable_fee_calculator::id(), "deprecate fee calculator"),
304313
(add_compute_budget_program::id(), "Add compute_budget_program"),
305314
(reject_deployment_of_unresolved_syscalls::id(), "Reject deployment of programs with unresolved syscall symbols"),
315+
(reject_section_virtual_address_file_offset_mismatch::id(), "enforce section virtual addresses and file offsets in ELF to be equal"),
306316
(nonce_must_be_writable::id(), "nonce must be writable"),
307317
(spl_token_v3_3_0_release::id(), "spl-token v3.3.0 release"),
308318
(leave_nonce_on_success::id(), "leave nonce as is on success"),

0 commit comments

Comments
 (0)