From 201637b3267a6fec91ca886c161d97c8cf697b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Thu, 10 Dec 2020 16:32:54 +0100 Subject: [PATCH] Updates rbpf to v0.2.2 (#14036) * Updates rbpf to v0.2.2 --- Cargo.lock | 8 +- cli/Cargo.toml | 2 +- programs/bpf/Cargo.lock | 8 +- programs/bpf/Cargo.toml | 2 +- programs/bpf_loader/Cargo.toml | 2 +- programs/bpf_loader/src/syscalls.rs | 297 +++++++++++++++------------- 6 files changed, 174 insertions(+), 145 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 35187e856a..7e237a8d29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1370,9 +1370,9 @@ dependencies = [ [[package]] name = "goblin" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20fd25aa456527ce4f544271ae4fea65d2eda4a6561ea56f39fb3ee4f7e3884" +checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c" dependencies = [ "log 0.4.8", "plain", @@ -5177,9 +5177,9 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fad65297e2bd080468cb57a97e6a62e9a92928a45960496338e997e8270fa00" +checksum = "a3f14c9649bc6c2dfc205b3450007ef02ec7331c1ea8f109468d53d159a09f3a" dependencies = [ "byteorder", "combine", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 1f1690bf81..2098989db6 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -37,7 +37,7 @@ solana-config-program = { path = "../programs/config", version = "1.5.0" } solana-faucet = { path = "../faucet", version = "1.5.0" } solana-logger = { path = "../logger", version = "1.5.0" } solana-net-utils = { path = "../net-utils", version = "1.5.0" } -solana_rbpf = "=0.2.1" +solana_rbpf = "=0.2.2" solana-remote-wallet = { path = "../remote-wallet", version = "1.5.0" } solana-sdk = { path = "../sdk", version = "1.5.0" } solana-stake-program = { path = "../programs/stake", version = "1.5.0" } diff --git a/programs/bpf/Cargo.lock b/programs/bpf/Cargo.lock index 789dbf72bd..3f226f4980 100644 --- a/programs/bpf/Cargo.lock +++ b/programs/bpf/Cargo.lock @@ -749,9 +749,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "goblin" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20fd25aa456527ce4f544271ae4fea65d2eda4a6561ea56f39fb3ee4f7e3884" +checksum = "c69552f48b18aa6102ce0c82dd9bc9d3f8af5fc0a5797069b1b466b90570e39c" dependencies = [ "log", "plain", @@ -2410,9 +2410,9 @@ dependencies = [ [[package]] name = "solana_rbpf" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fad65297e2bd080468cb57a97e6a62e9a92928a45960496338e997e8270fa00" +checksum = "a3f14c9649bc6c2dfc205b3450007ef02ec7331c1ea8f109468d53d159a09f3a" dependencies = [ "byteorder 1.3.4", "combine", diff --git a/programs/bpf/Cargo.toml b/programs/bpf/Cargo.toml index ccfc73a552..bad59e917b 100644 --- a/programs/bpf/Cargo.toml +++ b/programs/bpf/Cargo.toml @@ -27,7 +27,7 @@ solana-logger = { path = "../../logger", version = "1.5.0" } solana-measure = { path = "../../measure", version = "1.5.0" } solana-runtime = { path = "../../runtime", version = "1.5.0" } solana-sdk = { path = "../../sdk", version = "1.5.0" } -solana_rbpf = "=0.2.1" +solana_rbpf = "=0.2.2" [[bench]] name = "bpf_loader" diff --git a/programs/bpf_loader/Cargo.toml b/programs/bpf_loader/Cargo.toml index 7420ad6d98..49821dbc74 100644 --- a/programs/bpf_loader/Cargo.toml +++ b/programs/bpf_loader/Cargo.toml @@ -16,7 +16,7 @@ num-derive = "0.3" num-traits = "0.2" solana-runtime = { path = "../../runtime", version = "1.5.0" } solana-sdk = { path = "../../sdk", version = "1.5.0" } -solana_rbpf = "=0.2.1" +solana_rbpf = "=0.2.2" thiserror = "1.0" [dev-dependencies] diff --git a/programs/bpf_loader/src/syscalls.rs b/programs/bpf_loader/src/syscalls.rs index a4fbe850d2..2425bc9530 100644 --- a/programs/bpf_loader/src/syscalls.rs +++ b/programs/bpf_loader/src/syscalls.rs @@ -1396,7 +1396,7 @@ fn call<'a>( #[cfg(test)] mod tests { use super::*; - use solana_rbpf::memory_region::MemoryRegion; + use solana_rbpf::{memory_region::MemoryRegion, vm::Config}; use solana_sdk::{ bpf_loader, hash::hashv, @@ -1404,6 +1404,13 @@ mod tests { }; use std::str::FromStr; + const DEFAULT_CONFIG: Config = Config { + max_call_depth: 20, + stack_frame_size: 4_096, + enable_instruction_meter: true, + enable_instruction_tracing: false, + }; + macro_rules! assert_access_violation { ($result:expr, $va:expr, $len:expr) => { match $result { @@ -1419,9 +1426,10 @@ mod tests { const LENGTH: u64 = 1000; let data = vec![0u8; LENGTH as usize]; let addr = data.as_ptr() as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice( - &data, START, 0, false, - )]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion::new_from_slice(&data, START, 0, false)], + &DEFAULT_CONFIG, + ); let cases = vec![ (true, START, 0, addr), @@ -1456,13 +1464,16 @@ mod tests { // Pubkey let pubkey = solana_sdk::pubkey::new_rand(); let addr = &pubkey as *const _ as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: std::mem::size_of::() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: std::mem::size_of::() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_pubkey = translate_type::(&memory_mapping, 100, &bpf_loader::id()).unwrap(); assert_eq!(pubkey, *translated_pubkey); @@ -1474,13 +1485,16 @@ mod tests { vec![AccountMeta::new(solana_sdk::pubkey::new_rand(), false)], ); let addr = &instruction as *const _ as u64; - let mut memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 96, - len: std::mem::size_of::() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let mut memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 96, + len: std::mem::size_of::() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_instruction = translate_type::(&memory_mapping, 96, &bpf_loader::id()).unwrap(); assert_eq!(instruction, *translated_instruction); @@ -1495,13 +1509,16 @@ mod tests { let data: Vec = vec![]; assert_eq!(0x1 as *const u8, data.as_ptr()); let addr = good_data.as_ptr() as *const _ as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: good_data.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: good_data.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_data = translate_slice::(&memory_mapping, data.as_ptr() as u64, 0, &bpf_loader::id()) .unwrap(); @@ -1511,13 +1528,16 @@ mod tests { // u8 let mut data = vec![1u8, 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: 100, - len: data.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: data.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_data = translate_slice::(&memory_mapping, 100, data.len() as u64, &bpf_loader::id()) .unwrap(); @@ -1543,13 +1563,16 @@ mod tests { // 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::()) as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 96, + len: (data.len() * size_of::()) as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_data = translate_slice::(&memory_mapping, 96, data.len() as u64, &bpf_loader::id()) .unwrap(); @@ -1561,13 +1584,16 @@ mod tests { // Pubkeys let mut data = vec![solana_sdk::pubkey::new_rand(); 5]; let addr = data.as_ptr() as *const _ as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: (data.len() * std::mem::size_of::()) as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: (data.len() * std::mem::size_of::()) as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let translated_data = translate_slice::(&memory_mapping, 100, data.len() as u64, &bpf_loader::id()) .unwrap(); @@ -1580,13 +1606,16 @@ mod tests { fn test_translate_string_and_do() { let string = "Gaggablaghblagh!"; let addr = string.as_ptr() as *const _ as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: string.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: string.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); assert_eq!( 42, translate_string_and_do( @@ -1606,7 +1635,7 @@ mod tests { #[test] #[should_panic(expected = "UserError(SyscallError(Abort))")] fn test_syscall_abort() { - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion::default()]); + let memory_mapping = MemoryMapping::new(vec![MemoryRegion::default()], &DEFAULT_CONFIG); let mut result: Result> = Ok(0); SyscallAbort::call( &mut SyscallAbort {}, @@ -1626,13 +1655,16 @@ mod tests { fn test_syscall_sol_panic() { let string = "Gaggablaghblagh!"; let addr = string.as_ptr() as *const _ as u64; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: string.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: string.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let mut syscall_panic = SyscallPanic { loader_id: &bpf_loader::id(), }; @@ -1665,13 +1697,16 @@ mod tests { logger, loader_id: &bpf_loader::id(), }; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: string.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: string.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let mut result: Result> = Ok(0); syscall_sol_log.call( @@ -1741,7 +1776,7 @@ mod tests { compute_meter, logger, }; - let memory_mapping = MemoryMapping::new_from_regions(vec![]); + let memory_mapping = MemoryMapping::new(vec![], &DEFAULT_CONFIG); let mut result: Result> = Ok(0); syscall_sol_log_u64.call(1, 2, 3, 4, 5, &memory_mapping, &mut result); @@ -1767,13 +1802,16 @@ mod tests { logger, loader_id: &bpf_loader::id(), }; - let memory_mapping = MemoryMapping::new_from_regions(vec![MemoryRegion { - host_addr: addr, - vm_addr: 100, - len: 32, - vm_gap_shift: 63, - is_writable: false, - }]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion { + host_addr: addr, + vm_addr: 100, + len: 32, + vm_gap_shift: 63, + is_writable: false, + }], + &DEFAULT_CONFIG, + ); let mut result: Result> = Ok(0); syscall_sol_pubkey.call(100, 0, 0, 0, 0, &memory_mapping, &mut result); @@ -1809,13 +1847,10 @@ mod tests { // large alloc { let heap = vec![0_u8; 100]; - let memory_mapping = - MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice( - &heap, - MM_HEAP_START, - 0, - true, - )]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)], + &DEFAULT_CONFIG, + ); let mut syscall = SyscallAllocFree { aligned: true, allocator: BPFAllocator::new(heap, MM_HEAP_START), @@ -1833,13 +1868,10 @@ mod tests { // many small unaligned allocs { let heap = vec![0_u8; 100]; - let memory_mapping = - MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice( - &heap, - MM_HEAP_START, - 0, - true, - )]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)], + &DEFAULT_CONFIG, + ); let mut syscall = SyscallAllocFree { aligned: false, allocator: BPFAllocator::new(heap, MM_HEAP_START), @@ -1856,13 +1888,10 @@ mod tests { // many small aligned allocs { let heap = vec![0_u8; 100]; - let memory_mapping = - MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice( - &heap, - MM_HEAP_START, - 0, - true, - )]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)], + &DEFAULT_CONFIG, + ); let mut syscall = SyscallAllocFree { aligned: true, allocator: BPFAllocator::new(heap, MM_HEAP_START), @@ -1880,13 +1909,10 @@ mod tests { fn check_alignment() { let heap = vec![0_u8; 100]; - let memory_mapping = - MemoryMapping::new_from_regions(vec![MemoryRegion::new_from_slice( - &heap, - MM_HEAP_START, - 0, - true, - )]); + let memory_mapping = MemoryMapping::new( + vec![MemoryRegion::new_from_slice(&heap, MM_HEAP_START, 0, true)], + &DEFAULT_CONFIG, + ); let mut syscall = SyscallAllocFree { aligned: true, allocator: BPFAllocator::new(heap, MM_HEAP_START), @@ -1934,36 +1960,39 @@ mod tests { let ro_len = bytes_to_hash.len() as u64; let ro_va = 96; let rw_va = 192; - let memory_mapping = MemoryMapping::new_from_regions(vec![ - MemoryRegion { - host_addr: bytes1.as_ptr() as *const _ as u64, - vm_addr: 4096, - len: bytes1.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }, - MemoryRegion { - host_addr: bytes2.as_ptr() as *const _ as u64, - vm_addr: 8192, - len: bytes2.len() as u64, - vm_gap_shift: 63, - is_writable: false, - }, - MemoryRegion { - host_addr: bytes_to_hash.as_ptr() as *const _ as u64, - vm_addr: 96, - len: 32, - vm_gap_shift: 63, - is_writable: false, - }, - MemoryRegion { - host_addr: hash_result.as_ptr() as *const _ as u64, - vm_addr: rw_va, - len: HASH_BYTES as u64, - vm_gap_shift: 63, - is_writable: true, - }, - ]); + let memory_mapping = MemoryMapping::new( + vec![ + MemoryRegion { + host_addr: bytes1.as_ptr() as *const _ as u64, + vm_addr: 4096, + len: bytes1.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }, + MemoryRegion { + host_addr: bytes2.as_ptr() as *const _ as u64, + vm_addr: 8192, + len: bytes2.len() as u64, + vm_gap_shift: 63, + is_writable: false, + }, + MemoryRegion { + host_addr: bytes_to_hash.as_ptr() as *const _ as u64, + vm_addr: 96, + len: 32, + vm_gap_shift: 63, + is_writable: false, + }, + MemoryRegion { + host_addr: hash_result.as_ptr() as *const _ as u64, + vm_addr: rw_va, + len: HASH_BYTES as u64, + vm_gap_shift: 63, + is_writable: true, + }, + ], + &DEFAULT_CONFIG, + ); let compute_meter: Rc> = Rc::new(RefCell::new(MockComputeMeter { remaining: (bytes1.len() + bytes2.len()) as u64,