diff options
Diffstat (limited to 'devices/src/virtio/p9.rs')
-rw-r--r-- | devices/src/virtio/p9.rs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/devices/src/virtio/p9.rs b/devices/src/virtio/p9.rs index 6968733..6d89a45 100644 --- a/devices/src/virtio/p9.rs +++ b/devices/src/virtio/p9.rs @@ -17,7 +17,8 @@ use sys_util::{error, warn, Error as SysError, EventFd, GuestMemory, PollContext use virtio_sys::vhost::VIRTIO_F_VERSION_1; use super::{ - copy_config, Queue, Reader, VirtioDevice, Writer, INTERRUPT_STATUS_USED_RING, TYPE_9P, + copy_config, DescriptorError, Queue, Reader, VirtioDevice, Writer, INTERRUPT_STATUS_USED_RING, + TYPE_9P, }; const QUEUE_SIZE: u16 = 128; @@ -45,6 +46,8 @@ pub enum P9Error { NoWritableDescriptors, /// Failed to signal the virio used queue. SignalUsedQueue(SysError), + /// A DescriptorChain contains invalid data. + InvalidDescriptorChain(DescriptorError), /// An internal I/O error occurred. Internal(io::Error), } @@ -73,6 +76,9 @@ impl Display for P9Error { NoReadableDescriptors => write!(f, "request does not have any readable descriptors"), NoWritableDescriptors => write!(f, "request does not have any writable descriptors"), SignalUsedQueue(err) => write!(f, "failed to signal used queue: {}", err), + InvalidDescriptorChain(err) => { + write!(f, "DescriptorChain contains invalid data: {}", err) + } Internal(err) => write!(f, "P9 internal server error: {}", err), } } @@ -98,8 +104,10 @@ impl Worker { fn process_queue(&mut self) -> P9Result<()> { while let Some(avail_desc) = self.queue.pop(&self.mem) { - let mut reader = Reader::new(&self.mem, avail_desc.clone()); - let mut writer = Writer::new(&self.mem, avail_desc.clone()); + let mut reader = Reader::new(&self.mem, avail_desc.clone()) + .map_err(P9Error::InvalidDescriptorChain)?; + let mut writer = Writer::new(&self.mem, avail_desc.clone()) + .map_err(P9Error::InvalidDescriptorChain)?; self.server .handle_message(&mut reader, &mut writer) |