followup safety checks for #23295

This commit is contained in:
Trent Nelson 2022-02-23 19:44:43 -07:00 committed by Trent Nelson
parent d1f141484e
commit 5e0086c1ee
2 changed files with 35 additions and 17 deletions

View File

@ -1,5 +1,8 @@
#[cfg(RUSTC_WITH_SPECIALIZATION)] #[cfg(RUSTC_WITH_SPECIALIZATION)]
use solana_frozen_abi::abi_example::AbiExample; use solana_frozen_abi::abi_example::AbiExample;
#[cfg(debug_assertions)]
#[allow(deprecated)]
use solana_sdk::AutoTraitBreakSendSync;
use { use {
crate::system_instruction_processor, crate::system_instruction_processor,
solana_program_runtime::{ solana_program_runtime::{
@ -108,7 +111,7 @@ pub enum BuiltinAction {
/// State transition enum used for adding and removing builtin programs through /// State transition enum used for adding and removing builtin programs through
/// feature activations. /// feature activations.
#[derive(Debug, Clone, AbiExample)] #[derive(Debug, Clone, AbiExample)]
pub enum BuiltinFeatureTransition { enum InnerBuiltinFeatureTransition {
/// Add a builtin program if a feature is activated. /// Add a builtin program if a feature is activated.
Add { Add {
builtin: Builtin, builtin: Builtin,
@ -123,6 +126,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` // https://github.com/solana-labs/solana/pull/23233 added `BuiltinFeatureTransition`
// to `Bank` which triggers https://github.com/rust-lang/rust/issues/92987 while // to `Bank` which triggers https://github.com/rust-lang/rust/issues/92987 while
// attempting to resolve `Sync` on `BankRc` in `AccountsBackgroundService::new` ala, // attempting to resolve `Sync` on `BankRc` in `AccountsBackgroundService::new` ala,
@ -146,10 +156,10 @@ impl BuiltinFeatureTransition {
&self, &self,
should_apply_action_for_feature: &impl Fn(&Pubkey) -> bool, should_apply_action_for_feature: &impl Fn(&Pubkey) -> bool,
) -> Option<BuiltinAction> { ) -> Option<BuiltinAction> {
match self { match &self.0 {
Self::Add { InnerBuiltinFeatureTransition::Add {
builtin, builtin,
feature_id, ref feature_id,
} => { } => {
if should_apply_action_for_feature(feature_id) { if should_apply_action_for_feature(feature_id) {
Some(BuiltinAction::Add(builtin.clone())) Some(BuiltinAction::Add(builtin.clone()))
@ -157,10 +167,10 @@ impl BuiltinFeatureTransition {
None None
} }
} }
Self::RemoveOrRetain { InnerBuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin, previously_added_builtin,
addition_feature_id, ref addition_feature_id,
removal_feature_id, ref removal_feature_id,
} => { } => {
if should_apply_action_for_feature(removal_feature_id) { if should_apply_action_for_feature(removal_feature_id) {
Some(BuiltinAction::Remove(previously_added_builtin.id)) Some(BuiltinAction::Remove(previously_added_builtin.id))
@ -213,15 +223,15 @@ fn dummy_process_instruction(
/// Dynamic feature transitions for builtin programs /// Dynamic feature transitions for builtin programs
fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> { fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
vec![ vec![
BuiltinFeatureTransition::Add { BuiltinFeatureTransition(InnerBuiltinFeatureTransition::Add {
builtin: Builtin::new( builtin: Builtin::new(
"compute_budget_program", "compute_budget_program",
solana_sdk::compute_budget::id(), solana_sdk::compute_budget::id(),
solana_compute_budget_program::process_instruction, solana_compute_budget_program::process_instruction,
), ),
feature_id: feature_set::add_compute_budget_program::id(), feature_id: feature_set::add_compute_budget_program::id(),
}, }),
BuiltinFeatureTransition::RemoveOrRetain { BuiltinFeatureTransition(InnerBuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin: Builtin::new( previously_added_builtin: Builtin::new(
"secp256k1_program", "secp256k1_program",
solana_sdk::secp256k1_program::id(), solana_sdk::secp256k1_program::id(),
@ -229,8 +239,8 @@ fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
), ),
addition_feature_id: feature_set::secp256k1_program_enabled::id(), addition_feature_id: feature_set::secp256k1_program_enabled::id(),
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(), removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
}, }),
BuiltinFeatureTransition::RemoveOrRetain { BuiltinFeatureTransition(InnerBuiltinFeatureTransition::RemoveOrRetain {
previously_added_builtin: Builtin::new( previously_added_builtin: Builtin::new(
"ed25519_program", "ed25519_program",
solana_sdk::ed25519_program::id(), solana_sdk::ed25519_program::id(),
@ -238,23 +248,23 @@ fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
), ),
addition_feature_id: feature_set::ed25519_program_enabled::id(), addition_feature_id: feature_set::ed25519_program_enabled::id(),
removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(), removal_feature_id: feature_set::prevent_calling_precompiles_as_programs::id(),
}, }),
BuiltinFeatureTransition::Add { BuiltinFeatureTransition(InnerBuiltinFeatureTransition::Add {
builtin: Builtin::new( builtin: Builtin::new(
"address_lookup_table_program", "address_lookup_table_program",
solana_address_lookup_table_program::id(), solana_address_lookup_table_program::id(),
solana_address_lookup_table_program::processor::process_instruction, solana_address_lookup_table_program::processor::process_instruction,
), ),
feature_id: feature_set::versioned_tx_message_enabled::id(), feature_id: feature_set::versioned_tx_message_enabled::id(),
}, }),
BuiltinFeatureTransition::Add { BuiltinFeatureTransition(InnerBuiltinFeatureTransition::Add {
builtin: Builtin::new( builtin: Builtin::new(
"zk_token_proof_program", "zk_token_proof_program",
solana_zk_token_sdk::zk_token_proof_program::id(), solana_zk_token_sdk::zk_token_proof_program::id(),
with_program_logging!(solana_zk_token_proof_program::process_instruction), with_program_logging!(solana_zk_token_proof_program::process_instruction),
), ),
feature_id: feature_set::zk_token_sdk_enabled::id(), feature_id: feature_set::zk_token_sdk_enabled::id(),
}, }),
] ]
} }

View File

@ -97,6 +97,14 @@ pub use solana_sdk_macro::pubkeys;
#[rustversion::since(1.46.0)] #[rustversion::since(1.46.0)]
pub use solana_sdk_macro::respan; 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 // Unused `solana_sdk::program_stubs!()` macro retained for source backwards compatibility with older programs
#[macro_export] #[macro_export]
#[deprecated( #[deprecated(