From 37ee47c3e6af9a53213ec2110330c309f2f1c38f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 2 Sep 2021 03:04:13 +0000 Subject: [PATCH] Add executor using the program's id during deploy (#19555) (#19572) (cherry picked from commit 622a6fba7f41c715172c521325efb0b960c1f0af) Co-authored-by: Jack May --- programs/bpf_loader/src/lib.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index 93ae42a35e..1cd71a7a9b 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -344,6 +344,8 @@ fn process_loader_upgradeable_instruction( return Err(InstructionError::ExecutableAccountNotRentExempt); } + let new_program_id = *program.unsigned_key(); + // Verify Buffer account if let UpgradeableLoaderState::Buffer { authority_address } = buffer.state()? { @@ -383,7 +385,7 @@ fn process_loader_upgradeable_instruction( // Create ProgramData account let (derived_address, bump_seed) = - Pubkey::find_program_address(&[program.unsigned_key().as_ref()], program_id); + Pubkey::find_program_address(&[new_program_id.as_ref()], program_id); if derived_address != *programdata.unsigned_key() { ic_logger_msg!(logger, "ProgramData address is not derived"); return Err(InstructionError::InvalidArgument); @@ -397,7 +399,7 @@ fn process_loader_upgradeable_instruction( program_id, ); let caller_program_id = invoke_context.get_caller()?; - let signers = [&[program.unsigned_key().as_ref(), &[bump_seed]]] + let signers = [&[new_program_id.as_ref(), &[bump_seed]]] .iter() .map(|seeds| Pubkey::create_program_address(*seeds, caller_program_id)) .collect::, solana_sdk::pubkey::PubkeyError>>()?; @@ -410,7 +412,7 @@ fn process_loader_upgradeable_instruction( // Load and verify the program bits let executor = create_executor(3, buffer_data_offset, invoke_context, use_jit)?; - invoke_context.add_executor(program_id, executor); + invoke_context.add_executor(&new_program_id, executor); let keyed_accounts = invoke_context.get_keyed_accounts()?; let payer = keyed_account_at_index(keyed_accounts, 0)?; @@ -439,7 +441,7 @@ fn process_loader_upgradeable_instruction( .checked_add_lamports(buffer.lamports()?)?; buffer.try_account_ref_mut()?.set_lamports(0); - ic_logger_msg!(logger, "Deployed program {:?}", program.unsigned_key()); + ic_logger_msg!(logger, "Deployed program {:?}", new_program_id); } UpgradeableLoaderInstruction::Upgrade => { let programdata = keyed_account_at_index(keyed_accounts, 0)?; @@ -476,6 +478,8 @@ fn process_loader_upgradeable_instruction( return Err(InstructionError::InvalidAccountData); } + let new_program_id = *program.unsigned_key(); + // Verify Buffer account if let UpgradeableLoaderState::Buffer { authority_address } = buffer.state()? { @@ -538,10 +542,9 @@ fn process_loader_upgradeable_instruction( // Load and verify the program bits let executor = create_executor(2, buffer_data_offset, invoke_context, use_jit)?; - let keyed_accounts = invoke_context.get_keyed_accounts()?; - let program = keyed_account_at_index(keyed_accounts, 1)?; - invoke_context.add_executor(program.unsigned_key(), executor); + invoke_context.add_executor(&new_program_id, executor); + let keyed_accounts = invoke_context.get_keyed_accounts()?; let programdata = keyed_account_at_index(keyed_accounts, 0)?; let buffer = keyed_account_at_index(keyed_accounts, 2)?; let spill = keyed_account_at_index(keyed_accounts, 3)?; @@ -571,7 +574,7 @@ fn process_loader_upgradeable_instruction( .try_account_ref_mut()? .set_lamports(programdata_balance_required); - ic_logger_msg!(logger, "Upgraded program {:?}", program.unsigned_key()); + ic_logger_msg!(logger, "Upgraded program {:?}", new_program_id); } UpgradeableLoaderInstruction::SetAuthority => { let account = keyed_account_at_index(keyed_accounts, 0)?;