Skip to content

Commit

Permalink
Handle deprecated Instructions sysvar methods (#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

(cherry picked from commit adb9d9e)

# Conflicts:
#	sdk/program/Cargo.toml
#	sdk/program/src/sysvar/instructions.rs
  • Loading branch information
CriesofCarrots committed Jul 3, 2024
1 parent 262706a commit 42e9b70
Show file tree
Hide file tree
Showing 4 changed files with 24 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
5 changes: 5 additions & 0 deletions sdk/program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ log = { workspace = true }
memoffset = { workspace = true }
num-derive = { workspace = true }
num-traits = { workspace = true, features = ["i128"] }
<<<<<<< HEAD
rustversion = { workspace = true }
=======
qualifier_attr = { workspace = true, optional = true }
>>>>>>> adb9d9e3c9 (Handle deprecated Instructions sysvar methods (#1959))
serde = { workspace = true }
serde_bytes = { workspace = true }
serde_derive = { workspace = true }
Expand Down Expand Up @@ -92,4 +96,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"]
34 changes: 17 additions & 17 deletions sdk/program/src/sysvar/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#![allow(clippy::arithmetic_side_effects)]

<<<<<<< HEAD
use crate::{
account_info::AccountInfo,
instruction::{AccountMeta, Instruction},
Expand All @@ -37,6 +38,10 @@ use crate::{
sanitize::SanitizeError,
serialize_utils::{read_pubkey, read_slice, read_u16, read_u8},
};
=======
#[cfg(feature = "dev-context-only-utils")]
use qualifier_attr::qualifiers;
>>>>>>> adb9d9e3c9 (Handle deprecated Instructions sysvar methods (#1959))
#[cfg(not(target_os = "solana"))]
use {
crate::serialize_utils::{append_slice, append_u16, append_u8},
Expand Down Expand Up @@ -147,11 +152,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 @@ -172,10 +176,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 @@ -232,11 +234,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 @@ -255,7 +257,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 @@ -276,13 +278,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 42e9b70

Please sign in to comment.