From 34984ed16e1d1d048730646f6d2a534c43575f41 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Tue, 11 Jan 2022 20:55:10 -0700 Subject: [PATCH] v1.9: Only examine explicit tx accounts for rent state (#22442) * Add failing test * Fix: only examine accounts explicitly included in a tx --- runtime/src/bank.rs | 42 +++++++++++++++++++ .../bank/transaction_account_state_info.rs | 1 + 2 files changed, 43 insertions(+) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index c0abce392c..e22d79ea6d 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -15910,4 +15910,46 @@ pub(crate) mod tests { let result = bank.process_transaction(&tx); assert!(result.is_ok()); } + + #[test] + fn test_rent_state_list_len() { + let GenesisConfigInfo { + mut genesis_config, + mint_keypair, + .. + } = create_genesis_config_with_leader(sol_to_lamports(100.), &Pubkey::new_unique(), 42); + genesis_config.rent = Rent::default(); + // Activate features, including require_rent_exempt_accounts + activate_all_features(&mut genesis_config); + + let bank = Bank::new_for_tests(&genesis_config); + let recipient = Pubkey::new_unique(); + let tx = system_transaction::transfer( + &mint_keypair, + &recipient, + sol_to_lamports(1.), + bank.last_blockhash(), + ); + let num_accounts = tx.message().account_keys.len(); + let sanitized_tx = SanitizedTransaction::try_from_legacy_transaction(tx).unwrap(); + let mut error_counters = ErrorCounters::default(); + let loaded_txs = bank.rc.accounts.load_accounts( + &bank.ancestors, + &[sanitized_tx.clone()], + vec![(Ok(()), None)], + &bank.blockhash_queue.read().unwrap(), + &mut error_counters, + &bank.rent_collector, + &bank.feature_set, + ); + + let account_refcells = + Bank::accounts_to_refcells(&mut loaded_txs[0].0.as_ref().unwrap().accounts.clone()); + + assert_eq!( + bank.get_transaction_account_state_info(&account_refcells, sanitized_tx.message()) + .len(), + num_accounts, + ); + } } diff --git a/runtime/src/bank/transaction_account_state_info.rs b/runtime/src/bank/transaction_account_state_info.rs index bf04906705..221000e921 100644 --- a/runtime/src/bank/transaction_account_state_info.rs +++ b/runtime/src/bank/transaction_account_state_info.rs @@ -22,6 +22,7 @@ impl Bank { ) -> Vec { transaction_account_refcells .iter() + .take(message.account_keys_len()) .enumerate() .map(|(i, (_pubkey, account_refcell))| { let account = account_refcell.borrow();