Limit CPI instruction size (bp #14317) (#14354)

* Limit CPI instruction size (#14317)

(cherry picked from commit 5524938a50)

# Conflicts:
#	programs/bpf_loader/src/syscalls.rs
#	sdk/src/feature_set.rs

* resolve conflicts

Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
mergify[bot]
2020-12-30 20:23:52 +00:00
committed by GitHub
parent cfb28a1b2e
commit b88c56cd36
7 changed files with 162 additions and 5 deletions

View File

@@ -110,6 +110,10 @@ pub mod bpf_loader_upgradeable_program {
solana_sdk::declare_id!("FbhK8HN9qvNHvJcoFVHAEUCNkagHvu7DTWzdnLuVQ5u4");
}
pub mod max_cpi_instruction_size_ipv6_mtu {
solana_sdk::declare_id!("5WLtuUJA5VVA1Cc28qULPfGs8anhoBev8uNqaaXeasnf");
}
lazy_static! {
/// Map of feature identifiers to user-visible description
pub static ref FEATURE_NAMES: HashMap<Pubkey, &'static str> = [
@@ -139,6 +143,7 @@ lazy_static! {
(simple_capitalization::id(), "simple capitalization"),
(stake_program_v3::id(), "solana_stake_program v3"),
(bpf_loader_upgradeable_program::id(), "upgradeable bpf loader"),
(max_cpi_instruction_size_ipv6_mtu::id(), "Max cross-program invocation size 1280"),
/*************** ADD NEW FEATURES HERE ***************/
]
.iter()

View File

@@ -1,8 +1,8 @@
use solana_sdk::{
account::Account,
feature_set::{
bpf_compute_budget_balancing, max_invoke_depth_4, max_program_call_depth_64,
pubkey_log_syscall_enabled, FeatureSet,
bpf_compute_budget_balancing, max_cpi_instruction_size_ipv6_mtu, max_invoke_depth_4,
max_program_call_depth_64, pubkey_log_syscall_enabled, FeatureSet,
},
instruction::{CompiledInstruction, Instruction, InstructionError},
keyed_account::KeyedAccount,
@@ -91,6 +91,8 @@ pub struct BpfComputeBudget {
pub stack_frame_size: usize,
/// Number of compute units consumed by logging a `Pubkey`
pub log_pubkey_units: u64,
/// Maximum cross-program invocation instruction size
pub max_cpi_instruction_size: usize,
}
impl Default for BpfComputeBudget {
fn default() -> Self {
@@ -113,6 +115,7 @@ impl BpfComputeBudget {
max_call_depth: 20,
stack_frame_size: 4_096,
log_pubkey_units: 0,
max_cpi_instruction_size: std::usize::MAX,
};
if feature_set.is_active(&bpf_compute_budget_balancing::id()) {
@@ -144,6 +147,12 @@ impl BpfComputeBudget {
..bpf_compute_budget
};
}
if feature_set.is_active(&max_cpi_instruction_size_ipv6_mtu::id()) {
bpf_compute_budget = BpfComputeBudget {
max_cpi_instruction_size: 1280, // IPv6 Min MTU size
..bpf_compute_budget
};
}
bpf_compute_budget
}
}