Skip to content

Commit

Permalink
Handle deprecated Instructions sysvar methods (anza-xyz#1959)
Browse files Browse the repository at this point in the history
* Remove deprecated legacy-message methods (deprecated in v1.9)

* Unpub deprecated method load_current_index; dedupe

* Unpub deprecated method load_instruction_at; dedupe

* Remove allow(deprecated) tags

* Make load_instruction_at available to benches
  • Loading branch information
CriesofCarrots authored Jul 2, 2024
1 parent 58027a3 commit adb9d9e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 17 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions sdk/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ assert_matches = { workspace = true }
curve25519-dalek = { workspace = true }
hex = { workspace = true }
solana-logger = { workspace = true }
solana-program = { workspace = true, features = ["dev-context-only-utils"] }
solana-sdk = { path = ".", features = ["dev-context-only-utils"] }
static_assertions = { workspace = true }
tiny-bip39 = { workspace = true }
Expand Down
2 changes: 2 additions & 0 deletions sdk/program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ log = { workspace = true }
memoffset = { workspace = true }
num-derive = { workspace = true }
num-traits = { workspace = true, features = ["i128"] }
qualifier_attr = { workspace = true, optional = true }
serde = { workspace = true }
serde_bytes = { workspace = true }
serde_derive = { workspace = true }
Expand Down Expand Up @@ -94,4 +95,5 @@ crate-type = ["cdylib", "rlib"]
[features]
default = ["borsh"]
borsh = ["dep:borsh", "dep:borsh0-10"]
dev-context-only-utils = ["dep:qualifier_attr"]
frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro"]
31 changes: 14 additions & 17 deletions sdk/program/src/sysvar/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

#![allow(clippy::arithmetic_side_effects)]

#[cfg(feature = "dev-context-only-utils")]
use qualifier_attr::qualifiers;
#[cfg(not(target_os = "solana"))]
use {
crate::serialize_utils::{append_slice, append_u16, append_u8},
Expand Down Expand Up @@ -149,11 +151,10 @@ fn serialize_instructions(instructions: &[BorrowedInstruction]) -> Vec<u8> {
/// `Transaction`.
///
/// `data` is the instructions sysvar account data.
#[deprecated(
since = "1.8.0",
note = "Unsafe because the sysvar accounts address is not checked, please use `load_current_index_checked` instead"
)]
pub fn load_current_index(data: &[u8]) -> u16 {
///
/// Unsafe because the sysvar accounts address is not checked; only used
/// internally after such a check.
fn load_current_index(data: &[u8]) -> u16 {
let mut instr_fixed_data = [0u8; 2];
let len = data.len();
instr_fixed_data.copy_from_slice(&data[len - 2..len]);
Expand All @@ -174,10 +175,8 @@ pub fn load_current_index_checked(
}

let instruction_sysvar = instruction_sysvar_account_info.try_borrow_data()?;
let mut instr_fixed_data = [0u8; 2];
let len = instruction_sysvar.len();
instr_fixed_data.copy_from_slice(&instruction_sysvar[len - 2..len]);
Ok(u16::from_le_bytes(instr_fixed_data))
let index = load_current_index(&instruction_sysvar);
Ok(index)
}

/// Store the current `Instruction`'s index in the instructions sysvar data.
Expand Down Expand Up @@ -234,11 +233,11 @@ fn deserialize_instruction(index: usize, data: &[u8]) -> Result<Instruction, San
/// specified index.
///
/// `data` is the instructions sysvar account data.
#[deprecated(
since = "1.8.0",
note = "Unsafe because the sysvar accounts address is not checked, please use `load_instruction_at_checked` instead"
)]
pub fn load_instruction_at(index: usize, data: &[u8]) -> Result<Instruction, SanitizeError> {
///
/// Unsafe because the sysvar accounts address is not checked; only used
/// internally after such a check.
#[cfg_attr(feature = "dev-context-only-utils", qualifiers(pub))]
fn load_instruction_at(index: usize, data: &[u8]) -> Result<Instruction, SanitizeError> {
deserialize_instruction(index, data)
}

Expand All @@ -257,7 +256,7 @@ pub fn load_instruction_at_checked(
}

let instruction_sysvar = instruction_sysvar_account_info.try_borrow_data()?;
deserialize_instruction(index, &instruction_sysvar).map_err(|err| match err {
load_instruction_at(index, &instruction_sysvar).map_err(|err| match err {
SanitizeError::IndexOutOfBounds => ProgramError::InvalidArgument,
_ => ProgramError::InvalidInstructionData,
})
Expand All @@ -278,13 +277,11 @@ pub fn get_instruction_relative(
}

let instruction_sysvar = instruction_sysvar_account_info.data.borrow();
#[allow(deprecated)]
let current_index = load_current_index(&instruction_sysvar) as i64;
let index = current_index.saturating_add(index_relative_to_current);
if index < 0 {
return Err(ProgramError::InvalidArgument);
}
#[allow(deprecated)]
load_instruction_at(
current_index.saturating_add(index_relative_to_current) as usize,
&instruction_sysvar,
Expand Down

0 comments on commit adb9d9e

Please sign in to comment.