diff --git a/Cargo.lock b/Cargo.lock index 2ab3e4e860..e5f78d2941 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3569,6 +3569,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder", + "solana-bpf-loader-program", "solana-budget-program", "solana-clap-utils", "solana-cli-config", @@ -3587,6 +3588,7 @@ dependencies = [ "solana-version", "solana-vote-program", "solana-vote-signer", + "solana_rbpf", "tempfile", "thiserror", "url 2.1.1", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 91a891220f..75c1babcb5 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -29,6 +29,7 @@ serde_derive = "1.0.103" serde_json = "1.0.56" solana-account-decoder = { path = "../account-decoder", version = "1.3.18" } solana-budget-program = { path = "../programs/budget", version = "1.3.18" } +solana-bpf-loader-program = { path = "../programs/bpf_loader", version = "1.3.18" } solana-clap-utils = { path = "../clap-utils", version = "1.3.18" } solana-cli-config = { path = "../cli-config", version = "1.3.18" } solana-cli-output = { path = "../cli-output", version = "1.3.18" } @@ -37,6 +38,7 @@ solana-config-program = { path = "../programs/config", version = "1.3.18" } solana-faucet = { path = "../faucet", version = "1.3.18" } solana-logger = { path = "../logger", version = "1.3.18" } solana-net-utils = { path = "../net-utils", version = "1.3.18" } +solana_rbpf = "=0.1.32" solana-remote-wallet = { path = "../remote-wallet", version = "1.3.18" } solana-runtime = { path = "../runtime", version = "1.3.18" } solana-sdk = { path = "../sdk", version = "1.3.18" } diff --git a/cli/src/cli.rs b/cli/src/cli.rs index d8c356b477..234bc4d022 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -8,6 +8,7 @@ use log::*; use num_traits::FromPrimitive; use serde_json::{self, json, Value}; use solana_account_decoder::{UiAccount, UiAccountEncoding}; +use solana_bpf_loader_program::bpf_verifier; use solana_budget_program::budget_instruction::{self, BudgetError}; use solana_clap_utils::{ self, @@ -38,6 +39,7 @@ use solana_client::{ use solana_faucet::faucet::request_airdrop_transaction; #[cfg(test)] use solana_faucet::faucet_mock::request_airdrop_transaction; +use solana_rbpf::vm::EbpfVm; use solana_remote_wallet::remote_wallet::RemoteWalletManager; use solana_sdk::{ bpf_loader, bpf_loader_deprecated, @@ -1252,6 +1254,9 @@ fn process_deploy( CliError::DynamicProgramError(format!("Unable to read program file: {}", err)) })?; + EbpfVm::create_executable_from_elf(&program_data, Some(|x| bpf_verifier::check(x, true))) + .map_err(|err| CliError::DynamicProgramError(format!("ELF error: {}", err)))?; + let loader_id = if use_deprecated_loader { bpf_loader_deprecated::id() } else {