From 79a2ccabb4056383ee63b5a86cd6e31c2f14f210 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2020 04:30:29 +0000 Subject: [PATCH] Return an error from create_program_address syscall (bp #11658) (#11789) * Return an error from create_program_address syscall (#11658) (cherry picked from commit 750e5344f1e425889adaa534ffbaa78192227594) # Conflicts: # programs/bpf_loader/src/syscalls.rs * resolve conflicts * resolve conflicts Co-authored-by: Jack May --- programs/bpf/rust/invoke/src/lib.rs | 14 ++++++++++---- programs/bpf_loader/src/syscalls.rs | 7 +++++-- 2 files changed, 15 insertions(+), 6 deletions(-) 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 ed4df8e6fb..b5b5befa45 100644 --- a/programs/bpf_loader/src/syscalls.rs +++ b/programs/bpf_loader/src/syscalls.rs @@ -342,7 +342,7 @@ 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| { @@ -356,7 +356,10 @@ 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)