Skip to content

Commit 34e58c9

Browse files
committed
make usage of native loader error early
1 parent 1fff4c0 commit 34e58c9

File tree

2 files changed

+82
-40
lines changed

2 files changed

+82
-40
lines changed

runtime/src/bank/tests.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8400,13 +8400,16 @@ fn test_program_is_native_loader(formalize_loaded_transaction_data_size: bool) {
84008400
&[&mint_keypair],
84018401
bank.last_blockhash(),
84028402
);
8403-
assert_eq!(
8404-
bank.process_transaction(&tx),
8405-
Err(TransactionError::InstructionError(
8406-
0,
8407-
InstructionError::UnsupportedProgramId
8408-
))
8409-
);
8403+
8404+
let err = bank.process_transaction(&tx).unwrap_err();
8405+
if formalize_loaded_transaction_data_size {
8406+
assert_eq!(err, TransactionError::InvalidProgramForExecution,);
8407+
} else {
8408+
assert_eq!(
8409+
err,
8410+
TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId)
8411+
);
8412+
}
84108413
}
84118414

84128415
#[test_case(false; "informal_loaded_size")]
@@ -10577,20 +10580,31 @@ fn test_calculate_fee_secp256k1() {
1057710580
assert_eq!(calculate_test_fee(&message, 1, &fee_structure,), 11);
1057810581
}
1057910582

10580-
#[test]
10581-
fn test_an_empty_instruction_without_program() {
10583+
#[test_case(false; "informal_loaded_size")]
10584+
#[test_case(true; "simd186_loaded_size")]
10585+
fn test_an_empty_instruction_without_program(formalize_loaded_transaction_data_size: bool) {
1058210586
let (genesis_config, mint_keypair) = create_genesis_config_no_tx_fee_no_rent(1);
1058310587
let destination = solana_pubkey::new_rand();
1058410588
let mut ix = system_instruction::transfer(&mint_keypair.pubkey(), &destination, 0);
1058510589
ix.program_id = native_loader::id(); // Empty executable account chain
1058610590
let message = Message::new(&[ix], Some(&mint_keypair.pubkey()));
1058710591
let tx = Transaction::new(&[&mint_keypair], message, genesis_config.hash());
1058810592

10589-
let (bank, _bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
10590-
assert_eq!(
10591-
bank.process_transaction(&tx).unwrap_err(),
10592-
TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId),
10593-
);
10593+
let mut bank = Bank::new_for_tests(&genesis_config);
10594+
if !formalize_loaded_transaction_data_size {
10595+
bank.deactivate_feature(&feature_set::formalize_loaded_transaction_data_size::id());
10596+
}
10597+
let (bank, _bank_forks) = bank.wrap_with_bank_forks_for_tests();
10598+
10599+
let err = bank.process_transaction(&tx).unwrap_err();
10600+
if formalize_loaded_transaction_data_size {
10601+
assert_eq!(err, TransactionError::InvalidProgramForExecution,);
10602+
} else {
10603+
assert_eq!(
10604+
err,
10605+
TransactionError::InstructionError(0, InstructionError::UnsupportedProgramId)
10606+
);
10607+
}
1059410608
}
1059510609

1059610610
#[test]

svm/src/account_loader.rs

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -664,8 +664,8 @@ fn load_transaction_accounts_simd186<CB: TransactionProcessingCallback>(
664664

665665
for (program_id, instruction) in message.program_instructions_iter() {
666666
if native_loader::check_id(program_id) {
667-
loaded_transaction_accounts.program_indices.push(vec![]);
668-
continue;
667+
error_metrics.invalid_program_for_execution += 1;
668+
return Err(TransactionError::InvalidProgramForExecution);
669669
}
670670

671671
let Some(program_account) = account_loader.load_account(program_id) else {
@@ -1144,14 +1144,25 @@ mod tests {
11441144

11451145
assert_eq!(error_metrics.account_not_found.0, 0);
11461146
match &loaded_accounts {
1147-
TransactionLoadResult::Loaded(loaded_transaction) => {
1147+
TransactionLoadResult::Loaded(loaded_transaction)
1148+
if !formalize_loaded_transaction_data_size =>
1149+
{
1150+
assert_eq!(error_metrics.invalid_program_for_execution.0, 0);
11481151
assert_eq!(loaded_transaction.accounts.len(), 3);
11491152
assert_eq!(loaded_transaction.accounts[0].1, accounts[0].1);
11501153
assert_eq!(loaded_transaction.program_indices.len(), 1);
11511154
assert_eq!(loaded_transaction.program_indices[0].len(), 0);
11521155
}
1153-
TransactionLoadResult::FeesOnly(fees_only_tx) => panic!("{}", fees_only_tx.load_error),
1154-
TransactionLoadResult::NotLoaded(e) => panic!("{e}"),
1156+
TransactionLoadResult::FeesOnly(fees_only_tx)
1157+
if formalize_loaded_transaction_data_size =>
1158+
{
1159+
assert_eq!(error_metrics.invalid_program_for_execution.0, 1);
1160+
assert_eq!(
1161+
fees_only_tx.load_error,
1162+
TransactionError::InvalidProgramForExecution
1163+
);
1164+
}
1165+
result => panic!("unexpected result: {:?}", result),
11551166
}
11561167
}
11571168

@@ -1391,17 +1402,28 @@ mod tests {
13911402
let keypair = Keypair::new();
13921403
let account = AccountSharedData::new(1_000_000, 0, &Pubkey::default());
13931404

1405+
let mut program_account = AccountSharedData::default();
1406+
program_account.set_lamports(1);
1407+
program_account.set_executable(true);
1408+
program_account.set_owner(native_loader::id());
1409+
13941410
let instructions = vec![CompiledInstruction::new(2, &(), vec![0])];
13951411
let tx = Transaction::new_with_compiled_instructions(
13961412
&[&keypair],
13971413
&[slot_history_id],
13981414
Hash::default(),
1399-
vec![native_loader::id()],
1415+
vec![bpf_loader::id()],
14001416
instructions,
14011417
);
14021418

1403-
let loaded_accounts =
1404-
load_accounts_no_store(&[(keypair.pubkey(), account)], tx, Some(&account_overrides));
1419+
let loaded_accounts = load_accounts_no_store(
1420+
&[
1421+
(keypair.pubkey(), account),
1422+
(bpf_loader::id(), program_account),
1423+
],
1424+
tx,
1425+
Some(&account_overrides),
1426+
);
14051427
match &loaded_accounts {
14061428
TransactionLoadResult::Loaded(loaded_transaction) => {
14071429
assert_eq!(loaded_transaction.accounts[0].0, keypair.pubkey());
@@ -1718,24 +1740,30 @@ mod tests {
17181740
&RentCollector::default(),
17191741
);
17201742

1721-
let loaded_accounts_data_size = base_account_size as u32 * 2;
1722-
1723-
assert_eq!(
1724-
result.unwrap(),
1725-
LoadedTransactionAccounts {
1726-
accounts: vec![
1727-
(key1.pubkey(), fee_payer_account),
1728-
(
1729-
native_loader::id(),
1730-
mock_bank.accounts_map[&native_loader::id()].clone()
1731-
)
1732-
],
1733-
program_indices: vec![vec![]],
1734-
rent: 0,
1735-
rent_debits: RentDebits::default(),
1736-
loaded_accounts_data_size,
1737-
}
1738-
);
1743+
if formalize_loaded_transaction_data_size {
1744+
assert_eq!(
1745+
result.unwrap_err(),
1746+
TransactionError::InvalidProgramForExecution
1747+
);
1748+
} else {
1749+
let loaded_accounts_data_size = base_account_size as u32 * 2;
1750+
assert_eq!(
1751+
result.unwrap(),
1752+
LoadedTransactionAccounts {
1753+
accounts: vec![
1754+
(key1.pubkey(), fee_payer_account),
1755+
(
1756+
native_loader::id(),
1757+
mock_bank.accounts_map[&native_loader::id()].clone()
1758+
)
1759+
],
1760+
program_indices: vec![vec![]],
1761+
rent: 0,
1762+
rent_debits: RentDebits::default(),
1763+
loaded_accounts_data_size,
1764+
}
1765+
);
1766+
}
17391767
}
17401768

17411769
#[test]

0 commit comments

Comments
 (0)