diff --git a/programs/bpf/rust/invoke/src/lib.rs b/programs/bpf/rust/invoke/src/lib.rs index fa179eff26..53fb52fadf 100644 --- a/programs/bpf/rust/invoke/src/lib.rs +++ b/programs/bpf/rust/invoke/src/lib.rs @@ -12,7 +12,7 @@ use solana_sdk::{ info, program::{invoke, invoke_signed}, program_error::ProgramError, - pubkey::Pubkey, + pubkey::{Pubkey, PubkeyError}, system_instruction, }; @@ -97,9 +97,15 @@ fn process_instruction( info!("Test create_program_address"); { - let address = - Pubkey::create_program_address(&[b"You pass butter", &[nonce1]], program_id)?; - assert_eq!(&address, accounts[DERIVED_KEY1_INDEX].key); + assert_eq!( + &Pubkey::create_program_address(&[b"You pass butter", &[nonce1]], program_id)?, + accounts[DERIVED_KEY1_INDEX].key + ); + assert_eq!( + Pubkey::create_program_address(&[b"You pass butter"], &Pubkey::default()) + .unwrap_err(), + PubkeyError::InvalidSeeds + ); } info!("Test derived signers"); diff --git a/programs/bpf_loader/src/syscalls.rs b/programs/bpf_loader/src/syscalls.rs index 7c2cee8060..508e989abf 100644 --- a/programs/bpf_loader/src/syscalls.rs +++ b/programs/bpf_loader/src/syscalls.rs @@ -355,7 +355,8 @@ pub fn syscall_create_program_address( ro_regions: &[MemoryRegion], rw_regions: &[MemoryRegion], ) -> Result> { - let untranslated_seeds = translate_slice!(&[&str], seeds_addr, seeds_len, ro_regions)?; + let untranslated_seeds = translate_slice!(&[&u8], seeds_addr, seeds_len, ro_regions)?; + let seeds = untranslated_seeds .iter() .map(|untranslated_seed| { @@ -368,8 +369,12 @@ pub fn syscall_create_program_address( }) .collect::, EbpfError>>()?; let program_id = translate_type!(Pubkey, program_id_addr, ro_regions)?; + let new_address = - Pubkey::create_program_address(&seeds, program_id).map_err(SyscallError::BadSeeds)?; + match Pubkey::create_program_address(&seeds, program_id).map_err(SyscallError::BadSeeds) { + Ok(address) => address, + Err(_) => return Ok(1), + }; let address = translate_slice_mut!(u8, address_addr, 32, rw_regions)?; address.copy_from_slice(new_address.as_ref()); Ok(0)