diff --git a/runtime/src/message_processor.rs b/runtime/src/message_processor.rs index 6316b77f62..c6c661c674 100644 --- a/runtime/src/message_processor.rs +++ b/runtime/src/message_processor.rs @@ -175,7 +175,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); } @@ -1736,6 +1736,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)]