Re-fix arithmetic overflow and add better test (#13870)
This commit is contained in:
@ -313,7 +313,7 @@ fn translate_slice_mut<'a, T>(
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
access_type,
|
access_type,
|
||||||
vm_addr,
|
vm_addr,
|
||||||
len * size_of::<T>() as u64,
|
len.saturating_mul(size_of::<T>() as u64),
|
||||||
loader_id,
|
loader_id,
|
||||||
) {
|
) {
|
||||||
Ok(value) => Ok(unsafe { from_raw_parts_mut(value as *mut T, len as usize) }),
|
Ok(value) => Ok(unsafe { from_raw_parts_mut(value as *mut T, len as usize) }),
|
||||||
@ -1614,6 +1614,36 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.is_err());
|
.is_err());
|
||||||
|
|
||||||
|
// u64
|
||||||
|
let mut data = vec![1u64, 2, 3, 4, 5];
|
||||||
|
let addr = data.as_ptr() as *const _ as u64;
|
||||||
|
let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion {
|
||||||
|
host_addr: addr,
|
||||||
|
vm_addr: 96,
|
||||||
|
len: (data.len() * size_of::<u64>()) as u64,
|
||||||
|
vm_gap_shift: 63,
|
||||||
|
is_writable: false,
|
||||||
|
}]);
|
||||||
|
let translated_data = translate_slice::<u64>(
|
||||||
|
&memory_mapping,
|
||||||
|
AccessType::Load,
|
||||||
|
96,
|
||||||
|
data.len() as u64,
|
||||||
|
&bpf_loader::id(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(data, translated_data);
|
||||||
|
data[0] = 10;
|
||||||
|
assert_eq!(data, translated_data);
|
||||||
|
assert!(translate_slice::<u64>(
|
||||||
|
&memory_mapping,
|
||||||
|
AccessType::Load,
|
||||||
|
96,
|
||||||
|
u64::MAX,
|
||||||
|
&bpf_loader::id(),
|
||||||
|
)
|
||||||
|
.is_err());
|
||||||
|
|
||||||
// Pubkeys
|
// Pubkeys
|
||||||
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
|
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
|
||||||
let addr = data.as_ptr() as *const _ as u64;
|
let addr = data.as_ptr() as *const _ as u64;
|
||||||
|
Reference in New Issue
Block a user