diff --git a/virtio-devices/src/iommu.rs b/virtio-devices/src/iommu.rs index 55c73b1ae..f03a01dc9 100644 --- a/virtio-devices/src/iommu.rs +++ b/virtio-devices/src/iommu.rs @@ -18,7 +18,7 @@ use thiserror::Error; use virtio_queue::{DescriptorChain, Queue, QueueT}; use vm_device::dma_mapping::ExternalDmaMapping; use vm_memory::{ - Address, ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemoryAtomic, + Address, ByteValued, Bytes, GuestAddress, GuestAddressSpace, GuestMemory, GuestMemoryAtomic, GuestMemoryError, GuestMemoryLoadGuard, }; use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable}; @@ -371,6 +371,15 @@ impl Request { return Err(Error::InvalidRequest); } + if !desc_chain + .memory() + .check_range(desc.addr(), desc.len() as usize) + { + return Err(Error::GuestMemory(GuestMemoryError::InvalidGuestAddress( + desc.addr(), + ))); + } + let req_head: VirtioIommuReqHead = desc_chain .memory() .read_obj(desc.addr()) @@ -785,6 +794,15 @@ impl Request { return Err(Error::BufferLengthTooSmall); } + if !desc_chain + .memory() + .check_range(status_desc.addr(), status_desc.len() as usize) + { + return Err(Error::GuestMemory(GuestMemoryError::InvalidGuestAddress( + status_desc.addr(), + ))); + } + let tail = VirtioIommuReqTail { status, ..Default::default()