Re-fix arithmetic overflow and add better test (#13870)

This commit is contained in:
Jack May
2020-11-30 14:39:03 -08:00
committed by GitHub
parent 75e3f5cd48
commit 2d62f2ad03

View File

@ -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;