diff options
author | Zach Reizner <zachr@google.com> | 2019-05-30 18:31:02 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-04 20:29:25 +0000 |
commit | 127453d7eccdb6a903d0855fabb8f0935be90882 (patch) | |
tree | 65bd9f0b4c6b2a98c60bb2580949a93209c0f639 /kernel_loader | |
parent | 6a0bfb037a109030b69feb9dec4a546548636940 (diff) | |
download | crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.gz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.bz2 crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.lz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.xz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.zst crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.zip |
eliminate mut from non-mut references
This manifested itself in a couple places that were turning shared memory buffers into slices for the purposes of passing these slices to `Read` and `Write` trait methods. However, this required the removal of the methods that took `Read` and `Write` instances. This was a convenient interface but impossible to implement safely because making slices from raw pointers without enforcing safety guarantees causes undefined behaviour in Rust. It turns out lots of code in crosvm was using these interfaces indirectly, which explains why this CL touches so much. TEST=crosvm run BUG=chromium:938767 Change-Id: I4ff40c98da6ed08a4a42f4c31f0717f81b1c5863 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1636685 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'kernel_loader')
-rw-r--r-- | kernel_loader/src/lib.rs | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/kernel_loader/src/lib.rs b/kernel_loader/src/lib.rs index c11214f..7ff6efa 100644 --- a/kernel_loader/src/lib.rs +++ b/kernel_loader/src/lib.rs @@ -6,6 +6,7 @@ use std::ffi::CStr; use std::fmt::{self, Display}; use std::io::{Read, Seek, SeekFrom}; use std::mem; +use std::os::unix::io::AsRawFd; use sys_util::{GuestAddress, GuestMemory}; @@ -73,7 +74,7 @@ pub fn load_kernel<F>( kernel_image: &mut F, ) -> Result<u64> where - F: Read + Seek, + F: Read + Seek + AsRawFd, { let mut ehdr: elf::Elf64_Ehdr = Default::default(); kernel_image @@ -171,8 +172,9 @@ pub fn load_cmdline( #[cfg(test)] mod test { use super::*; - use std::io::Cursor; - use sys_util::{GuestAddress, GuestMemory}; + use std::fs::File; + use std::io::Write; + use sys_util::{GuestAddress, GuestMemory, SharedMemory}; const MEM_SIZE: u64 = 0x8000; @@ -223,21 +225,29 @@ mod test { } // Elf64 image that prints hello world on x86_64. - fn make_elf_bin() -> Vec<u8> { - let mut v = Vec::new(); - v.extend_from_slice(include_bytes!("test_elf.bin")); - v + fn make_elf_bin() -> File { + let elf_bytes = include_bytes!("test_elf.bin"); + let mut shm = SharedMemory::new(None).expect("failed to create shared memory"); + shm.set_size(elf_bytes.len() as u64) + .expect("failed to set shared memory size"); + shm.write_all(elf_bytes) + .expect("failed to write elf to shared memoy"); + shm.into() + } + + fn mutate_elf_bin(mut f: &File, offset: u64, val: u8) { + f.seek(SeekFrom::Start(offset)) + .expect("failed to seek file"); + f.write(&[val]) + .expect("failed to write mutated value to file"); } #[test] fn load_elf() { let gm = create_guest_mem(); let kernel_addr = GuestAddress(0x0); - let image = make_elf_bin(); - assert_eq!( - Ok(16613), - load_kernel(&gm, kernel_addr, &mut Cursor::new(&image)) - ); + let mut image = make_elf_bin(); + assert_eq!(Ok(16613), load_kernel(&gm, kernel_addr, &mut image)); } #[test] @@ -245,10 +255,10 @@ mod test { let gm = create_guest_mem(); let kernel_addr = GuestAddress(0x0); let mut bad_image = make_elf_bin(); - bad_image[0x1] = 0x33; + mutate_elf_bin(&bad_image, 0x1, 0x33); assert_eq!( Err(Error::InvalidElfMagicNumber), - load_kernel(&gm, kernel_addr, &mut Cursor::new(&bad_image)) + load_kernel(&gm, kernel_addr, &mut bad_image) ); } @@ -258,10 +268,10 @@ mod test { let gm = create_guest_mem(); let kernel_addr = GuestAddress(0x0); let mut bad_image = make_elf_bin(); - bad_image[0x5] = 2; + mutate_elf_bin(&bad_image, 0x5, 2); assert_eq!( Err(Error::BigEndianElfOnLittle), - load_kernel(&gm, kernel_addr, &mut Cursor::new(&bad_image)) + load_kernel(&gm, kernel_addr, &mut bad_image) ); } @@ -271,10 +281,10 @@ mod test { let gm = create_guest_mem(); let kernel_addr = GuestAddress(0x0); let mut bad_image = make_elf_bin(); - bad_image[0x20] = 0x10; + mutate_elf_bin(&bad_image, 0x20, 0x10); assert_eq!( Err(Error::InvalidProgramHeaderOffset), - load_kernel(&gm, kernel_addr, &mut Cursor::new(&bad_image)) + load_kernel(&gm, kernel_addr, &mut bad_image) ); } } |