summary refs log tree commit diff
path: root/sys_util/src/mmap.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2017-09-07 19:03:41 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-09-11 22:47:10 -0700
commit270f7b6a16a1c0475da061d5ecb344db10306a64 (patch)
tree0f653e71765d77203bb7c43c322d04e70b1185e7 /sys_util/src/mmap.rs
parent6f366b54604e4012b43822d5dc2afe7d1616287d (diff)
downloadcrosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar.gz
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar.bz2
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar.lz
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar.xz
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.tar.zst
crosvm-270f7b6a16a1c0475da061d5ecb344db10306a64.zip
Improve guest memory error handling
Pass better errors from mmap and guest_memory. These modules were
written before I understood errors. Now the errors passed back to block
can be propagated.

Change-Id: I1842808a4114a715321c555281aacc211f23511c
Signed-off-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/656837
Reviewed-by: Jason Clinton <jclinton@chromium.org>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'sys_util/src/mmap.rs')
-rw-r--r--sys_util/src/mmap.rs18
1 files changed, 8 insertions, 10 deletions
diff --git a/sys_util/src/mmap.rs b/sys_util/src/mmap.rs
index 78f533d..13526d5 100644
--- a/sys_util/src/mmap.rs
+++ b/sys_util/src/mmap.rs
@@ -21,8 +21,10 @@ use data_model::DataInit;
 pub enum Error {
     /// Requested memory out of range.
     InvalidAddress,
+    /// Requested memory range spans past the end of the region.
+    InvalidRange(usize, usize),
     /// Couldn't read from the given source.
-    ReadFromSource,
+    ReadFromSource(std::io::Error),
     /// `mmap` returned the given error.
     SystemCallFailed(errno::Error),
     /// Writing to memory failed
@@ -243,16 +245,14 @@ impl MemoryMapping {
     {
         let mem_end = mem_offset + count;
         if mem_end > self.size() {
-            return Err(Error::InvalidAddress);
+            return Err(Error::InvalidRange(mem_offset, count));
         }
         unsafe {
             // It is safe to overwrite the volatile memory.  Acessing the guest
             // memory as a mutable slice is OK because nothing assumes another
             // thread won't change what is loaded.
             let mut dst = &mut self.as_mut_slice()[mem_offset..mem_end];
-            if src.read_exact(dst).is_err() {
-                return Err(Error::ReadFromSource);
-            }
+            src.read_exact(dst).map_err(Error::ReadFromSource)?;
         }
         Ok(())
     }
@@ -283,20 +283,18 @@ impl MemoryMapping {
         where F: Write
     {
         let mem_end = match mem_offset.checked_add(count) {
-            None => return Err(Error::InvalidAddress),
+            None => return Err(Error::InvalidRange(mem_offset, count)),
             Some(m) => m,
         };
         if mem_end > self.size() {
-            return Err(Error::InvalidAddress);
+            return Err(Error::InvalidRange(mem_offset, count));
         }
         unsafe {
             // It is safe to read from volatile memory.  Acessing the guest
             // memory as a slice is OK because nothing assumes another thread
             // won't change what is loaded.
             let src = &self.as_mut_slice()[mem_offset..mem_end];
-            if dst.write_all(src).is_err() {
-                return Err(Error::ReadFromSource);
-            }
+            dst.write_all(src).map_err(Error::ReadFromSource)?;
         }
         Ok(())
     }