Fix - Revert and feature gate incorrect error message in BPF loader (#30748)
* Revert to old behavior. * Adds feature gate.
This commit is contained in:
parent
f4cde7a51c
commit
66da71fa7a
|
@ -45,7 +45,8 @@ use {
|
||||||
check_slice_translation_size, delay_visibility_of_program_deployment,
|
check_slice_translation_size, delay_visibility_of_program_deployment,
|
||||||
disable_deploy_of_alloc_free_syscall, enable_bpf_loader_extend_program_ix,
|
disable_deploy_of_alloc_free_syscall, enable_bpf_loader_extend_program_ix,
|
||||||
enable_bpf_loader_set_authority_checked_ix, enable_program_redeployment_cooldown,
|
enable_bpf_loader_set_authority_checked_ix, enable_program_redeployment_cooldown,
|
||||||
limit_max_instruction_trace_length, round_up_heap_size, FeatureSet,
|
limit_max_instruction_trace_length, remove_bpf_loader_incorrect_program_id,
|
||||||
|
round_up_heap_size, FeatureSet,
|
||||||
},
|
},
|
||||||
instruction::{AccountMeta, InstructionError},
|
instruction::{AccountMeta, InstructionError},
|
||||||
loader_instruction::LoaderInstruction,
|
loader_instruction::LoaderInstruction,
|
||||||
|
@ -440,20 +441,88 @@ fn process_instruction_common(
|
||||||
let log_collector = invoke_context.get_log_collector();
|
let log_collector = invoke_context.get_log_collector();
|
||||||
let transaction_context = &invoke_context.transaction_context;
|
let transaction_context = &invoke_context.transaction_context;
|
||||||
let instruction_context = transaction_context.get_current_instruction_context()?;
|
let instruction_context = transaction_context.get_current_instruction_context()?;
|
||||||
|
|
||||||
|
if !invoke_context
|
||||||
|
.feature_set
|
||||||
|
.is_active(&remove_bpf_loader_incorrect_program_id::id())
|
||||||
|
{
|
||||||
|
fn get_index_in_transaction(
|
||||||
|
instruction_context: &InstructionContext,
|
||||||
|
index_in_instruction: IndexOfAccount,
|
||||||
|
) -> Result<IndexOfAccount, InstructionError> {
|
||||||
|
if index_in_instruction < instruction_context.get_number_of_program_accounts() {
|
||||||
|
instruction_context
|
||||||
|
.get_index_of_program_account_in_transaction(index_in_instruction)
|
||||||
|
} else {
|
||||||
|
instruction_context.get_index_of_instruction_account_in_transaction(
|
||||||
|
index_in_instruction
|
||||||
|
.saturating_sub(instruction_context.get_number_of_program_accounts()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn try_borrow_account<'a>(
|
||||||
|
transaction_context: &'a TransactionContext,
|
||||||
|
instruction_context: &'a InstructionContext,
|
||||||
|
index_in_instruction: IndexOfAccount,
|
||||||
|
) -> Result<BorrowedAccount<'a>, InstructionError> {
|
||||||
|
if index_in_instruction < instruction_context.get_number_of_program_accounts() {
|
||||||
|
instruction_context
|
||||||
|
.try_borrow_program_account(transaction_context, index_in_instruction)
|
||||||
|
} else {
|
||||||
|
instruction_context.try_borrow_instruction_account(
|
||||||
|
transaction_context,
|
||||||
|
index_in_instruction
|
||||||
|
.saturating_sub(instruction_context.get_number_of_program_accounts()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let first_instruction_account = {
|
||||||
|
let borrowed_root_account =
|
||||||
|
instruction_context.try_borrow_program_account(transaction_context, 0)?;
|
||||||
|
let owner_id = borrowed_root_account.get_owner();
|
||||||
|
if native_loader::check_id(owner_id) {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let first_account_key = transaction_context.get_key_of_account_at_index(
|
||||||
|
get_index_in_transaction(instruction_context, first_instruction_account)?,
|
||||||
|
)?;
|
||||||
|
let second_account_key = get_index_in_transaction(
|
||||||
|
instruction_context,
|
||||||
|
first_instruction_account.saturating_add(1),
|
||||||
|
)
|
||||||
|
.and_then(|index_in_transaction| {
|
||||||
|
transaction_context.get_key_of_account_at_index(index_in_transaction)
|
||||||
|
});
|
||||||
|
let program_id = instruction_context.get_last_program_key(transaction_context)?;
|
||||||
|
if first_account_key == program_id
|
||||||
|
|| second_account_key
|
||||||
|
.map(|key| key == program_id)
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
} else {
|
||||||
|
let first_account = try_borrow_account(
|
||||||
|
transaction_context,
|
||||||
|
instruction_context,
|
||||||
|
first_instruction_account,
|
||||||
|
)?;
|
||||||
|
if first_account.is_executable() {
|
||||||
|
ic_logger_msg!(log_collector, "BPF loader is executable");
|
||||||
|
return Err(InstructionError::IncorrectProgramId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let program_account =
|
let program_account =
|
||||||
instruction_context.try_borrow_last_program_account(transaction_context)?;
|
instruction_context.try_borrow_last_program_account(transaction_context)?;
|
||||||
|
|
||||||
// Program Management Instruction
|
// Program Management Instruction
|
||||||
if native_loader::check_id(program_account.get_owner()) {
|
if native_loader::check_id(program_account.get_owner()) {
|
||||||
drop(program_account);
|
drop(program_account);
|
||||||
if instruction_context
|
|
||||||
.try_borrow_instruction_account(transaction_context, 0)
|
|
||||||
.map(|account| account.is_executable())
|
|
||||||
.unwrap_or(false)
|
|
||||||
{
|
|
||||||
ic_logger_msg!(log_collector, "BPF loader is executable");
|
|
||||||
return Err(InstructionError::IncorrectProgramId);
|
|
||||||
}
|
|
||||||
let program_id = instruction_context.get_last_program_key(transaction_context)?;
|
let program_id = instruction_context.get_last_program_key(transaction_context)?;
|
||||||
return if bpf_loader_upgradeable::check_id(program_id) {
|
return if bpf_loader_upgradeable::check_id(program_id) {
|
||||||
process_loader_upgradeable_instruction(invoke_context, use_jit)
|
process_loader_upgradeable_instruction(invoke_context, use_jit)
|
||||||
|
|
|
@ -2188,6 +2188,9 @@ fn test_program_sbf_disguised_as_sbf_loader() {
|
||||||
let mut bank = Bank::new_for_tests(&genesis_config);
|
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||||
let (name, id, entrypoint) = solana_bpf_loader_program!();
|
let (name, id, entrypoint) = solana_bpf_loader_program!();
|
||||||
bank.add_builtin(&name, &id, entrypoint);
|
bank.add_builtin(&name, &id, entrypoint);
|
||||||
|
bank.deactivate_feature(
|
||||||
|
&solana_sdk::feature_set::remove_bpf_loader_incorrect_program_id::id(),
|
||||||
|
);
|
||||||
let bank_client = BankClient::new(bank);
|
let bank_client = BankClient::new(bank);
|
||||||
|
|
||||||
let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program);
|
let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program);
|
||||||
|
|
|
@ -630,6 +630,10 @@ pub mod round_up_heap_size {
|
||||||
solana_sdk::declare_id!("CE2et8pqgyQMP2mQRg3CgvX8nJBKUArMu3wfiQiQKY1y");
|
solana_sdk::declare_id!("CE2et8pqgyQMP2mQRg3CgvX8nJBKUArMu3wfiQiQKY1y");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod remove_bpf_loader_incorrect_program_id {
|
||||||
|
solana_sdk::declare_id!("2HmTkCj9tXuPE4ueHzdD7jPeMf9JGCoZh5AsyoATiWEe");
|
||||||
|
}
|
||||||
|
|
||||||
pub mod vote_state_add_vote_latency {
|
pub mod vote_state_add_vote_latency {
|
||||||
solana_sdk::declare_id!("7axKe5BTYBDD87ftzWbk5DfzWMGyRvqmWTduuo22Yaqy");
|
solana_sdk::declare_id!("7axKe5BTYBDD87ftzWbk5DfzWMGyRvqmWTduuo22Yaqy");
|
||||||
}
|
}
|
||||||
|
@ -786,6 +790,7 @@ lazy_static! {
|
||||||
(add_set_tx_loaded_accounts_data_size_instruction::id(), "add compute budget instruction for setting account data size per transaction #30366"),
|
(add_set_tx_loaded_accounts_data_size_instruction::id(), "add compute budget instruction for setting account data size per transaction #30366"),
|
||||||
(switch_to_new_elf_parser::id(), "switch to new ELF parser #30497"),
|
(switch_to_new_elf_parser::id(), "switch to new ELF parser #30497"),
|
||||||
(round_up_heap_size::id(), "round up heap size when calculating heap cost #30679"),
|
(round_up_heap_size::id(), "round up heap size when calculating heap cost #30679"),
|
||||||
|
(remove_bpf_loader_incorrect_program_id::id(), "stop incorrectly throwing IncorrectProgramId in bpf_loader #30747"),
|
||||||
(vote_state_add_vote_latency::id(), "replace Lockout with LandedVote (including vote latency) in vote state"),
|
(vote_state_add_vote_latency::id(), "replace Lockout with LandedVote (including vote latency) in vote state"),
|
||||||
/*************** ADD NEW FEATURES HERE ***************/
|
/*************** ADD NEW FEATURES HERE ***************/
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue