Check native account owner (#14535)
(cherry picked from commit 8ad5931bfc)
			
			
This commit is contained in:
		| @@ -487,7 +487,7 @@ impl MessageProcessor { | |||||||
|                 } |                 } | ||||||
|                 // Call the program via the native loader |                 // Call the program via the native loader | ||||||
|                 return self.native_loader.process_instruction( |                 return self.native_loader.process_instruction( | ||||||
|                     program_id, |                     &native_loader::id(), | ||||||
|                     keyed_accounts, |                     keyed_accounts, | ||||||
|                     instruction_data, |                     instruction_data, | ||||||
|                     invoke_context, |                     invoke_context, | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ use solana_sdk::{ | |||||||
|     entrypoint_native::ProgramEntrypoint, |     entrypoint_native::ProgramEntrypoint, | ||||||
|     instruction::InstructionError, |     instruction::InstructionError, | ||||||
|     keyed_account::{next_keyed_account, KeyedAccount}, |     keyed_account::{next_keyed_account, KeyedAccount}, | ||||||
|  |     native_loader, | ||||||
|     process_instruction::{InvokeContext, LoaderEntrypoint}, |     process_instruction::{InvokeContext, LoaderEntrypoint}, | ||||||
|     pubkey::Pubkey, |     pubkey::Pubkey, | ||||||
| }; | }; | ||||||
| @@ -126,13 +127,22 @@ impl NativeLoader { | |||||||
|  |  | ||||||
|     pub fn process_instruction( |     pub fn process_instruction( | ||||||
|         &self, |         &self, | ||||||
|         _program_id: &Pubkey, |         program_id: &Pubkey, | ||||||
|         keyed_accounts: &[KeyedAccount], |         keyed_accounts: &[KeyedAccount], | ||||||
|         instruction_data: &[u8], |         instruction_data: &[u8], | ||||||
|         invoke_context: &dyn InvokeContext, |         invoke_context: &dyn InvokeContext, | ||||||
|     ) -> Result<(), InstructionError> { |     ) -> Result<(), InstructionError> { | ||||||
|         let mut keyed_accounts_iter = keyed_accounts.iter(); |         let mut keyed_accounts_iter = keyed_accounts.iter(); | ||||||
|         let program = next_keyed_account(&mut keyed_accounts_iter)?; |         let program = next_keyed_account(&mut keyed_accounts_iter)?; | ||||||
|  |         if native_loader::id() != *program_id { | ||||||
|  |             error!("Program id mismatch"); | ||||||
|  |             return Err(InstructionError::IncorrectProgramId); | ||||||
|  |         } | ||||||
|  |         if program.owner()? != *program_id { | ||||||
|  |             error!("Executable account now owned by loader"); | ||||||
|  |             return Err(InstructionError::IncorrectProgramId); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         let params = keyed_accounts_iter.as_slice(); |         let params = keyed_accounts_iter.as_slice(); | ||||||
|         let name_vec = &program.try_account_ref()?.data; |         let name_vec = &program.try_account_ref()?.data; | ||||||
|         let name = match str::from_utf8(name_vec) { |         let name = match str::from_utf8(name_vec) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user