summary refs log tree commit diff
path: root/sys_util
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-11-26 13:02:47 -0800
committerCommit Bot <commit-bot@chromium.org>2019-12-06 09:37:53 +0000
commit92a2c49349404b4ba90941e18e8a828beca52390 (patch)
tree955fe83d8a3b867d184777ae5d611244b5f75136 /sys_util
parent6a8470679503482a9cc794ec55c984f5564cf9f6 (diff)
downloadcrosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar.gz
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar.bz2
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar.lz
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar.xz
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.tar.zst
crosvm-92a2c49349404b4ba90941e18e8a828beca52390.zip
sys_util: guest_memory: check u64 to usize conversion
Replace the unchecked conversion with a try_from() rather than just
truncating without warning.  This gives a more useful error message when
a >4GB guest memory size is requested on a 32-bit platform.

BUG=chromium:1028747
TEST=`crosvm run -m $((5 * 1024)) ...` on kevin

Change-Id: Ib1fcf4019eefdc9ee8f93a5307802e6d6d43d01c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1937552
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'sys_util')
-rw-r--r--sys_util/src/guest_memory.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys_util/src/guest_memory.rs b/sys_util/src/guest_memory.rs
index a745248..9e23278 100644
--- a/sys_util/src/guest_memory.rs
+++ b/sys_util/src/guest_memory.rs
@@ -4,6 +4,7 @@
 
 //! Track memory regions that are mapped to the guest VM.
 
+use std::convert::TryFrom;
 use std::fmt::{self, Display};
 use std::os::unix::io::{AsRawFd, RawFd};
 use std::result;
@@ -23,6 +24,7 @@ pub enum Error {
     MemoryAccess(GuestAddress, mmap::Error),
     MemoryMappingFailed(mmap::Error),
     MemoryRegionOverlap,
+    MemoryRegionTooLarge(u64),
     MemoryNotAligned,
     MemoryCreationFailed(errno::Error),
     MemorySetSizeFailed(errno::Error),
@@ -51,6 +53,7 @@ impl Display for Error {
             }
             MemoryMappingFailed(e) => write!(f, "failed to map guest memory: {}", e),
             MemoryRegionOverlap => write!(f, "memory regions overlap"),
+            MemoryRegionTooLarge(size) => write!(f, "memory region size {} is too large", size),
             MemoryNotAligned => write!(f, "memfd regions must be page aligned"),
             MemoryCreationFailed(_) => write!(f, "failed to create memfd region"),
             MemorySetSizeFailed(e) => write!(f, "failed to set memfd region size: {}", e),
@@ -155,7 +158,9 @@ impl GuestMemory {
                 }
             }
 
-            let mapping = MemoryMapping::from_fd_offset(&memfd, range.1 as usize, offset)
+            let size =
+                usize::try_from(range.1).map_err(|_| Error::MemoryRegionTooLarge(range.1))?;
+            let mapping = MemoryMapping::from_fd_offset(&memfd, size, offset)
                 .map_err(Error::MemoryMappingFailed)?;
             regions.push(MemoryRegion {
                 mapping,
@@ -163,7 +168,7 @@ impl GuestMemory {
                 memfd_offset: offset,
             });
 
-            offset += range.1 as usize;
+            offset += size;
         }
 
         Ok(GuestMemory {