diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2019-11-26 13:02:47 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-12-06 09:37:53 +0000 |
commit | 92a2c49349404b4ba90941e18e8a828beca52390 (patch) | |
tree | 955fe83d8a3b867d184777ae5d611244b5f75136 /sys_util | |
parent | 6a8470679503482a9cc794ec55c984f5564cf9f6 (diff) | |
download | crosvm-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.rs | 9 |
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 { |