Cleanup - Feature gate of `check_slice_translation_size` (#34084)

Cleans up feature gate of check_slice_translation_size.
This commit is contained in:
Alexander Meißner 2023-11-15 20:58:10 +01:00 committed by GitHub
parent d58db6e255
commit b168cadeea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 18 additions and 114 deletions

View File

@ -20,7 +20,7 @@ use {
solana_sdk::{
account::AccountSharedData,
bpf_loader_deprecated,
feature_set::{check_slice_translation_size, native_programs_consume_cu, FeatureSet},
feature_set::{native_programs_consume_cu, FeatureSet},
hash::Hash,
instruction::{AccountMeta, InstructionError},
native_loader,
@ -599,12 +599,6 @@ impl<'a> InvokeContext<'a> {
.unwrap_or(true)
}
// Set should type size be checked during user pointer translation
pub fn get_check_size(&self) -> bool {
self.feature_set
.is_active(&check_slice_translation_size::id())
}
// Set this instruction syscall context
pub fn set_syscall_context(
&mut self,

View File

@ -239,7 +239,6 @@ impl<'a, 'b> CallerAccount<'a, 'b> {
vm_data_addr,
data.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
};
(
@ -344,7 +343,6 @@ impl<'a, 'b> CallerAccount<'a, 'b> {
account_info.data_addr,
account_info.data_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
};
@ -498,7 +496,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust {
ix.accounts.as_ptr() as u64,
ix.accounts.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let accounts = if invoke_context
.feature_set
@ -542,7 +539,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust {
ix.data.as_ptr() as u64,
ix_data_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.to_vec();
@ -597,7 +593,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust {
signers_seeds_addr,
signers_seeds_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if signers_seeds.len() > MAX_SIGNERS {
return Err(Box::new(SyscallError::TooManySigners));
@ -608,7 +603,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust {
signer_seeds.as_ptr() as *const _ as u64,
signer_seeds.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if untranslated_seeds.len() > MAX_SEEDS {
return Err(Box::new(InstructionError::MaxSeedLengthExceeded));
@ -621,7 +615,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedRust {
untranslated_seed.as_ptr() as *const _ as u64,
untranslated_seed.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)
})
.collect::<Result<Vec<_>, Error>>()?;
@ -740,7 +733,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC {
ix_c.accounts_addr,
ix_c.accounts_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let ix_data_len = ix_c.data_len;
@ -761,7 +753,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC {
ix_c.data_addr,
ix_data_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.to_vec();
@ -862,7 +853,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC {
signers_seeds_addr,
signers_seeds_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if signers_seeds.len() > MAX_SIGNERS {
return Err(Box::new(SyscallError::TooManySigners));
@ -875,7 +865,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC {
signer_seeds.addr,
signer_seeds.len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if seeds.len() > MAX_SEEDS {
return Err(Box::new(InstructionError::MaxSeedLengthExceeded) as Error);
@ -888,7 +877,6 @@ impl SyscallInvokeSigned for SyscallInvokeSignedC {
seed.addr,
seed.len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)
})
.collect::<Result<Vec<_>, Error>>()?;
@ -917,7 +905,6 @@ where
account_infos_addr,
account_infos_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
check_account_infos(account_infos.len(), invoke_context)?;
let account_info_keys = if invoke_context
@ -1336,7 +1323,6 @@ fn update_callee_account(
.saturating_add(caller_account.original_data_len as u64),
realloc_bytes_used as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
callee_account
.get_data_mut()?
@ -1581,7 +1567,6 @@ fn update_caller_account(
.saturating_add(dirty_realloc_start as u64),
dirty_realloc_len as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
serialized_data.fill(0);
}
@ -1602,7 +1587,6 @@ fn update_caller_account(
caller_account.vm_data_addr,
post_len as u64,
false, // Don't care since it is byte aligned
invoke_context.get_check_size(),
)?;
}
// this is the len field in the AccountInfo::data slice
@ -1666,7 +1650,6 @@ fn update_caller_account(
.saturating_add(caller_account.original_data_len as u64),
realloc_bytes_used as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
};
let from_slice = callee_account
@ -2182,15 +2165,9 @@ mod tests {
// check that the caller account data pointer always matches the callee account data pointer
assert_eq!(
translate_slice::<u8>(
&memory_mapping,
caller_account.vm_data_addr,
1,
true,
true
)
.unwrap()
.as_ptr(),
translate_slice::<u8>(&memory_mapping, caller_account.vm_data_addr, 1, true,)
.unwrap()
.as_ptr(),
callee_account.get_data().as_ptr()
);
@ -2210,7 +2187,6 @@ mod tests {
.saturating_add(caller_account.original_data_len as u64),
MAX_PERMITTED_DATA_INCREASE as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)
.unwrap();
@ -2360,7 +2336,6 @@ mod tests {
caller_account.vm_data_addr,
callee_account.get_data().len() as u64,
true,
true,
)
.unwrap();
assert_eq!(data, callee_account.get_data());
@ -2632,7 +2607,6 @@ mod tests {
.saturating_add(caller_account.original_data_len as u64),
3,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)
.unwrap();
serialized_data.copy_from_slice(b"baz");

View File

@ -23,7 +23,6 @@ declare_builtin_function!(
addr,
len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
invoke_context
.feature_set
.is_active(&stop_truncating_strings_in_syscalls::id()),
@ -129,7 +128,6 @@ declare_builtin_function!(
addr,
len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
consume_compute_meter(
@ -153,7 +151,6 @@ declare_builtin_function!(
untranslated_field.as_ptr() as *const _ as u64,
untranslated_field.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?);
}

View File

@ -84,14 +84,12 @@ declare_builtin_function!(
s1_addr,
n,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let s2 = translate_slice::<u8>(
memory_mapping,
s2_addr,
n,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let cmp_result = translate_type_mut::<i32>(
memory_mapping,
@ -137,7 +135,6 @@ declare_builtin_function!(
dst_addr,
n,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
s.fill(c as u8);
Ok(0)
@ -163,7 +160,6 @@ fn memmove(
dst_addr,
n,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.as_mut_ptr();
let src_ptr = translate_slice::<u8>(
@ -171,7 +167,6 @@ fn memmove(
src_addr,
n,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.as_ptr();

View File

@ -514,14 +514,13 @@ fn translate_slice_inner<'a, T>(
vm_addr: u64,
len: u64,
check_aligned: bool,
check_size: bool,
) -> Result<&'a mut [T], Error> {
if len == 0 {
return Ok(&mut []);
}
let total_size = len.saturating_mul(size_of::<T>() as u64);
if check_size && isize::try_from(total_size).is_err() {
if isize::try_from(total_size).is_err() {
return Err(SyscallError::InvalidLength.into());
}
@ -537,7 +536,6 @@ fn translate_slice_mut<'a, T>(
vm_addr: u64,
len: u64,
check_aligned: bool,
check_size: bool,
) -> Result<&'a mut [T], Error> {
translate_slice_inner::<T>(
memory_mapping,
@ -545,7 +543,6 @@ fn translate_slice_mut<'a, T>(
vm_addr,
len,
check_aligned,
check_size,
)
}
fn translate_slice<'a, T>(
@ -553,7 +550,6 @@ fn translate_slice<'a, T>(
vm_addr: u64,
len: u64,
check_aligned: bool,
check_size: bool,
) -> Result<&'a [T], Error> {
translate_slice_inner::<T>(
memory_mapping,
@ -561,7 +557,6 @@ fn translate_slice<'a, T>(
vm_addr,
len,
check_aligned,
check_size,
)
.map(|value| &*value)
}
@ -573,11 +568,10 @@ fn translate_string_and_do(
addr: u64,
len: u64,
check_aligned: bool,
check_size: bool,
stop_truncating_strings_in_syscalls: bool,
work: &mut dyn FnMut(&str) -> Result<u64, Error>,
) -> Result<u64, Error> {
let buf = translate_slice::<u8>(memory_mapping, addr, len, check_aligned, check_size)?;
let buf = translate_slice::<u8>(memory_mapping, addr, len, check_aligned)?;
let msg = if stop_truncating_strings_in_syscalls {
buf
} else {
@ -632,7 +626,6 @@ declare_builtin_function!(
file,
len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
invoke_context
.feature_set
.is_active(&stop_truncating_strings_in_syscalls::id()),
@ -685,15 +678,9 @@ fn translate_and_check_program_address_inputs<'a>(
program_id_addr: u64,
memory_mapping: &mut MemoryMapping,
check_aligned: bool,
check_size: bool,
) -> Result<(Vec<&'a [u8]>, &'a Pubkey), Error> {
let untranslated_seeds = translate_slice::<&[u8]>(
memory_mapping,
seeds_addr,
seeds_len,
check_aligned,
check_size,
)?;
let untranslated_seeds =
translate_slice::<&[u8]>(memory_mapping, seeds_addr, seeds_len, check_aligned)?;
if untranslated_seeds.len() > MAX_SEEDS {
return Err(SyscallError::BadSeeds(PubkeyError::MaxSeedLengthExceeded).into());
}
@ -708,7 +695,6 @@ fn translate_and_check_program_address_inputs<'a>(
untranslated_seed.as_ptr() as *const _ as u64,
untranslated_seed.len() as u64,
check_aligned,
check_size,
)
})
.collect::<Result<Vec<_>, Error>>()?;
@ -739,7 +725,6 @@ declare_builtin_function!(
program_id_addr,
memory_mapping,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let Ok(new_address) = Pubkey::create_program_address(&seeds, program_id) else {
@ -750,7 +735,6 @@ declare_builtin_function!(
address_addr,
32,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
address.copy_from_slice(new_address.as_ref());
Ok(0)
@ -780,7 +764,6 @@ declare_builtin_function!(
program_id_addr,
memory_mapping,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let mut bump_seed = [std::u8::MAX];
@ -802,7 +785,6 @@ declare_builtin_function!(
address_addr,
std::mem::size_of::<Pubkey>() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if !is_nonoverlapping(
bump_seed_ref as *const _ as usize,
@ -844,21 +826,18 @@ declare_builtin_function!(
hash_addr,
keccak::HASH_BYTES as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let signature = translate_slice::<u8>(
memory_mapping,
signature_addr,
SECP256K1_SIGNATURE_LENGTH as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let secp256k1_recover_result = translate_slice_mut::<u8>(
memory_mapping,
result_addr,
SECP256K1_PUBLIC_KEY_LENGTH as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let Ok(message) = libsecp256k1::Message::parse_slice(hash) else {
@ -1188,7 +1167,6 @@ declare_builtin_function!(
scalars_addr,
points_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let points = translate_slice::<edwards::PodEdwardsPoint>(
@ -1196,7 +1174,6 @@ declare_builtin_function!(
points_addr,
points_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if let Some(result_point) = edwards::multiscalar_multiply_edwards(scalars, points) {
@ -1228,7 +1205,6 @@ declare_builtin_function!(
scalars_addr,
points_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let points = translate_slice::<ristretto::PodRistrettoPoint>(
@ -1236,7 +1212,6 @@ declare_builtin_function!(
points_addr,
points_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if let Some(result_point) =
@ -1290,7 +1265,6 @@ declare_builtin_function!(
addr,
len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.to_vec()
};
@ -1337,7 +1311,6 @@ declare_builtin_function!(
return_data_addr,
length,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let to_slice = return_data_result;
@ -1439,14 +1412,12 @@ declare_builtin_function!(
data_addr,
result_header.data_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let accounts = translate_slice_mut::<AccountMeta>(
memory_mapping,
accounts_addr,
result_header.accounts_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
if !is_nonoverlapping(
@ -1589,7 +1560,6 @@ declare_builtin_function!(
input_addr,
input_size,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let call_result = translate_slice_mut::<u8>(
@ -1597,7 +1567,6 @@ declare_builtin_function!(
result_addr,
output as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let calculation = match group_op {
@ -1642,7 +1611,6 @@ declare_builtin_function!(
params,
1,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?
.first()
.ok_or(SyscallError::InvalidLength)?;
@ -1670,7 +1638,6 @@ declare_builtin_function!(
params.base as *const _ as u64,
params.base_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let exponent = translate_slice::<u8>(
@ -1678,7 +1645,6 @@ declare_builtin_function!(
params.exponent as *const _ as u64,
params.exponent_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let modulus = translate_slice::<u8>(
@ -1686,7 +1652,6 @@ declare_builtin_function!(
params.modulus as *const _ as u64,
params.modulus_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let value = big_mod_exp(base, exponent, modulus);
@ -1696,7 +1661,6 @@ declare_builtin_function!(
return_value,
params.modulus_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
return_value.copy_from_slice(value.as_slice());
@ -1743,14 +1707,12 @@ declare_builtin_function!(
result_addr,
poseidon::HASH_BYTES as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let inputs = translate_slice::<&[u8]>(
memory_mapping,
vals_addr,
vals_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let inputs = inputs
.iter()
@ -1760,7 +1722,6 @@ declare_builtin_function!(
input.as_ptr() as *const _ as u64,
input.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)
})
.collect::<Result<Vec<_>, Error>>()?;
@ -1842,7 +1803,6 @@ declare_builtin_function!(
input_addr,
input_size,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let call_result = translate_slice_mut::<u8>(
@ -1850,7 +1810,6 @@ declare_builtin_function!(
result_addr,
output as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
match op {
@ -1933,7 +1892,6 @@ declare_builtin_function!(
result_addr,
std::mem::size_of::<H::Output>() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let mut hasher = H::create_hasher();
if vals_len > 0 {
@ -1942,7 +1900,6 @@ declare_builtin_function!(
vals_addr,
vals_len,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
for val in vals.iter() {
let bytes = translate_slice::<u8>(
@ -1950,7 +1907,6 @@ declare_builtin_function!(
val.as_ptr() as u64,
val.len() as u64,
invoke_context.get_check_aligned(),
invoke_context.get_check_size(),
)?;
let cost = compute_budget.mem_op_base_cost.max(
hash_byte_cost.saturating_mul(
@ -2130,7 +2086,7 @@ mod tests {
)
.unwrap();
let translated_data =
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, 0, true, true).unwrap();
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, 0, true).unwrap();
assert_eq!(data, translated_data);
assert_eq!(0, translated_data.len());
@ -2143,24 +2099,18 @@ mod tests {
)
.unwrap();
let translated_data =
translate_slice::<u8>(&memory_mapping, 0x100000000, data.len() as u64, true, true)
.unwrap();
translate_slice::<u8>(&memory_mapping, 0x100000000, data.len() as u64, true).unwrap();
assert_eq!(data, translated_data);
*data.first_mut().unwrap() = 10;
assert_eq!(data, translated_data);
assert!(
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, u64::MAX, true, true)
.is_err()
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, u64::MAX, true).is_err()
);
assert!(translate_slice::<u8>(
&memory_mapping,
0x100000000 - 1,
data.len() as u64,
true,
true
)
.is_err());
assert!(
translate_slice::<u8>(&memory_mapping, 0x100000000 - 1, data.len() as u64, true,)
.is_err()
);
// u64
let mut data = vec![1u64, 2, 3, 4, 5];
@ -2174,14 +2124,11 @@ mod tests {
)
.unwrap();
let translated_data =
translate_slice::<u64>(&memory_mapping, 0x100000000, data.len() as u64, true, true)
.unwrap();
translate_slice::<u64>(&memory_mapping, 0x100000000, data.len() as u64, true).unwrap();
assert_eq!(data, translated_data);
*data.first_mut().unwrap() = 10;
assert_eq!(data, translated_data);
assert!(
translate_slice::<u64>(&memory_mapping, 0x100000000, u64::MAX, true, true).is_err()
);
assert!(translate_slice::<u64>(&memory_mapping, 0x100000000, u64::MAX, true).is_err());
// Pubkeys
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
@ -2197,7 +2144,7 @@ mod tests {
)
.unwrap();
let translated_data =
translate_slice::<Pubkey>(&memory_mapping, 0x100000000, data.len() as u64, true, true)
translate_slice::<Pubkey>(&memory_mapping, 0x100000000, data.len() as u64, true)
.unwrap();
assert_eq!(data, translated_data);
*data.first_mut().unwrap() = solana_sdk::pubkey::new_rand(); // Both should point to same place
@ -2222,7 +2169,6 @@ mod tests {
string.len() as u64,
true,
true,
true,
&mut |string: &str| {
assert_eq!(string, "Gaggablaghblagh!");
Ok(42)
@ -3703,7 +3649,6 @@ mod tests {
VM_BASE_ADDRESS.saturating_add(DATA_OFFSET as u64),
processed_sibling_instruction.data_len,
true,
true,
)
.unwrap();
let accounts = translate_slice_mut::<AccountMeta>(
@ -3711,7 +3656,6 @@ mod tests {
VM_BASE_ADDRESS.saturating_add(ACCOUNTS_OFFSET as u64),
processed_sibling_instruction.accounts_len,
true,
true,
)
.unwrap();