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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 1 deletions

View File

@ -313,7 +313,7 @@ fn translate_slice_mut<'a, T>(
memory_mapping,
access_type,
vm_addr,
len * size_of::<T>() as u64,
len.saturating_mul(size_of::<T>() as u64),
loader_id,
) {
Ok(value) => Ok(unsafe { from_raw_parts_mut(value as *mut T, len as usize) }),
@ -1614,6 +1614,36 @@ mod tests {
)
.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
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
let addr = data.as_ptr() as *const _ as u64;