* fix arithmetic overflow in slice translation (#13624)
* fix arithmetic overflow in slice translation
* nudge
(cherry picked from commit 8c922a0198)
# Conflicts:
#	programs/bpf_loader/src/syscalls.rs
* fix conflicts
Co-authored-by: Jack May <jack@solana.com>
			
			
This commit is contained in:
		@@ -268,7 +268,7 @@ macro_rules! translate_slice_mut {
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            match translate_addr::<BPFError>(
 | 
					            match translate_addr::<BPFError>(
 | 
				
			||||||
                $vm_addr as u64,
 | 
					                $vm_addr as u64,
 | 
				
			||||||
                $len as usize * size_of::<$t>(),
 | 
					                ($len as usize).saturating_mul(size_of::<$t>()),
 | 
				
			||||||
                file!(),
 | 
					                file!(),
 | 
				
			||||||
                line!() as usize - ELF_INSN_DUMP_OFFSET + 1,
 | 
					                line!() as usize - ELF_INSN_DUMP_OFFSET + 1,
 | 
				
			||||||
                $regions,
 | 
					                $regions,
 | 
				
			||||||
@@ -1354,7 +1354,7 @@ mod tests {
 | 
				
			|||||||
            len: good_data.len() as u64,
 | 
					            len: good_data.len() as u64,
 | 
				
			||||||
        }];
 | 
					        }];
 | 
				
			||||||
        let translated_data =
 | 
					        let translated_data =
 | 
				
			||||||
            translate_slice!(u8, data.as_ptr(), data.len(), ®ions, &bpf_loader::id()).unwrap();
 | 
					            translate_slice!(u8, data.as_ptr(), 0, ®ions, &bpf_loader::id()).unwrap();
 | 
				
			||||||
        assert_eq!(data, translated_data);
 | 
					        assert_eq!(data, translated_data);
 | 
				
			||||||
        assert_eq!(0, translated_data.len());
 | 
					        assert_eq!(0, translated_data.len());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1371,6 +1371,11 @@ mod tests {
 | 
				
			|||||||
        assert_eq!(data, translated_data);
 | 
					        assert_eq!(data, translated_data);
 | 
				
			||||||
        data[0] = 10;
 | 
					        data[0] = 10;
 | 
				
			||||||
        assert_eq!(data, translated_data);
 | 
					        assert_eq!(data, translated_data);
 | 
				
			||||||
 | 
					        assert!(
 | 
				
			||||||
 | 
					            translate_slice!(u8, data.as_ptr(), u64::MAX, ®ions, &bpf_loader::id()).is_err()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert!(translate_slice!(u8, 100 - 1, data.len(), ®ions, &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];
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user