Skip to content

Commit

Permalink
followup safety checks for #23295
Browse files Browse the repository at this point in the history
  • Loading branch information
t-nelson committed Feb 24, 2022
1 parent 4bc4406 commit 020dd1c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 49 deletions.
121 changes: 72 additions & 49 deletions runtime/src/builtins.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#[cfg(RUSTC_WITH_SPECIALIZATION)]
use solana_frozen_abi::abi_example::AbiExample;
#[allow(deprecated)]
use solana_sdk::AutoTraitBreakSendSync;
use {
crate::system_instruction_processor,
solana_program_runtime::{
Expand Down Expand Up @@ -108,7 +110,7 @@ pub enum BuiltinAction {
/// State transition enum used for adding and removing builtin programs through
/// feature activations.
#[derive(Debug, Clone, AbiExample)]
pub enum BuiltinFeatureTransition {
enum InnerBuiltinFeatureTransition {
/// Add a builtin program if a feature is activated.
Add {
builtin: Builtin,
Expand All @@ -123,6 +125,13 @@ pub enum BuiltinFeatureTransition {
},
}

#[allow(deprecated)]
#[cfg(debug_assertions)]
impl AutoTraitBreakSendSync for InnerBuiltinFeatureTransition {}

#[derive(AbiExample, Clone, Debug)]
pub struct BuiltinFeatureTransition(InnerBuiltinFeatureTransition);

// https://github.com/solana-labs/solana/pull/23233 added `BuiltinFeatureTransition`
// to `Bank` which triggers https://github.com/rust-lang/rust/issues/92987 while
// attempting to resolve `Sync` on `BankRc` in `AccountsBackgroundService::new` ala,
Expand All @@ -142,25 +151,49 @@ unsafe impl Send for BuiltinFeatureTransition {}
unsafe impl Sync for BuiltinFeatureTransition {}

impl BuiltinFeatureTransition {
pub fn new_add(
name: &str,
id: Pubkey,
process_instruction_with_context: ProcessInstructionWithContext,
feature_id: Pubkey,
) -> Self {
Self(InnerBuiltinFeatureTransition::Add {
builtin: Builtin::new(name, id, process_instruction_with_context),
feature_id,
})
}
pub fn new_remove_or_retain(
name: &str,
id: Pubkey,
process_instruction_with_context: ProcessInstructionWithContext,
addition_feature_id: Pubkey,
removal_feature_id: Pubkey,
) -> Self {
Self(InnerBuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin: Builtin::new(name, id, process_instruction_with_context),
addition_feature_id,
removal_feature_id,
})
}
pub fn to_action(
&self,
should_apply_action_for_feature: &impl Fn(&Pubkey) -> bool,
) -> Option<BuiltinAction> {
match self {
Self::Add {
match &self.0 {
InnerBuiltinFeatureTransition::Add {
builtin,
feature_id,
ref feature_id,
} => {
if should_apply_action_for_feature(feature_id) {
Some(BuiltinAction::Add(builtin.clone()))
} else {
None
}
}
Self::RemoveOrRetain {
InnerBuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin,
addition_feature_id,
removal_feature_id,
ref addition_feature_id,
ref removal_feature_id,
} => {
if should_apply_action_for_feature(removal_feature_id) {
Some(BuiltinAction::Remove(previously_added_builtin.id))
Expand Down Expand Up @@ -213,48 +246,38 @@ fn dummy_process_instruction(
/// Dynamic feature transitions for builtin programs
fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
vec![
BuiltinFeatureTransition::Add {
builtin: Builtin::new(
"compute_budget_program",
solana_sdk::compute_budget::id(),
solana_compute_budget_program::process_instruction,
),
feature_id: feature_set::add_compute_budget_program::id(),
},
BuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin: Builtin::new(
"secp256k1_program",
solana_sdk::secp256k1_program::id(),
dummy_process_instruction,
),
addition_feature_id: feature_set::secp256k1_program_enabled::id(),
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
},
BuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin: Builtin::new(
"ed25519_program",
solana_sdk::ed25519_program::id(),
dummy_process_instruction,
),
addition_feature_id: feature_set::ed25519_program_enabled::id(),
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
},
BuiltinFeatureTransition::Add {
builtin: Builtin::new(
"address_lookup_table_program",
solana_address_lookup_table_program::id(),
solana_address_lookup_table_program::processor::process_instruction,
),
feature_id: feature_set::versioned_tx_message_enabled::id(),
},
BuiltinFeatureTransition::Add {
builtin: Builtin::new(
"zk_token_proof_program",
solana_zk_token_sdk::zk_token_proof_program::id(),
with_program_logging!(solana_zk_token_proof_program::process_instruction),
),
feature_id: feature_set::zk_token_sdk_enabled::id(),
},
BuiltinFeatureTransition::new_add(
"compute_budget_program",
solana_sdk::compute_budget::id(),
solana_compute_budget_program::process_instruction,
feature_set::add_compute_budget_program::id(),
),
BuiltinFeatureTransition::new_remove_or_retain(
"secp256k1_program",
solana_sdk::secp256k1_program::id(),
dummy_process_instruction,
feature_set::secp256k1_program_enabled::id(),
feature_set::prevent_calling_precompiles_as_programs::id(),
),
BuiltinFeatureTransition::new_remove_or_retain(
"ed25519_program",
solana_sdk::ed25519_program::id(),
dummy_process_instruction,
feature_set::ed25519_program_enabled::id(),
feature_set::prevent_calling_precompiles_as_programs::id(),
),
BuiltinFeatureTransition::new_add(
"address_lookup_table_program",
solana_address_lookup_table_program::id(),
solana_address_lookup_table_program::processor::process_instruction,
feature_set::versioned_tx_message_enabled::id(),
),
BuiltinFeatureTransition::new_add(
"zk_token_proof_program",
solana_zk_token_sdk::zk_token_proof_program::id(),
with_program_logging!(solana_zk_token_proof_program::process_instruction),
feature_set::zk_token_sdk_enabled::id(),
),
]
}

Expand Down
8 changes: 8 additions & 0 deletions sdk/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ pub use solana_sdk_macro::pubkeys;
#[rustversion::since(1.46.0)]
pub use solana_sdk_macro::respan;

#[deprecated(
since = "1.9.0",
note = "use only to break https://github.com/rust-lang/rust/issues/92987. remove when we move to Rust 1.60.0"
)]
#[doc(hidden)]
#[cfg(debug_assertions)]
pub trait AutoTraitBreakSendSync: Send + Sync {}

// Unused `solana_sdk::program_stubs!()` macro retained for source backwards compatibility with older programs
#[macro_export]
#[deprecated(
Expand Down

0 comments on commit 020dd1c

Please sign in to comment.