diff --git a/runtime/src/message_processor.rs b/runtime/src/message_processor.rs index 2c539a865f..2e66151ab1 100644 --- a/runtime/src/message_processor.rs +++ b/runtime/src/message_processor.rs @@ -180,7 +180,7 @@ impl PreAccount { } if !is_writable // line coverage used to get branch coverage || pre.executable() - || program_id != pre.owner() + || program_id != post.owner() { return Err(InstructionError::ExecutableModified); } @@ -1787,6 +1787,21 @@ mod tests { ); } + #[test] + fn test_verify_account_changes_owner_executable() { + let alice_program_id = solana_sdk::pubkey::new_rand(); + let bob_program_id = solana_sdk::pubkey::new_rand(); + + assert_eq!( + Change::new(&alice_program_id, &alice_program_id) + .owner(&bob_program_id) + .executable(false, true) + .verify(), + Err(InstructionError::ExecutableModified), + "Program should not be able to change owner and executable at the same time" + ); + } + #[test] fn test_process_message_readonly_handling() { #[derive(Serialize, Deserialize)]