diff --git a/virtio-devices/src/vsock/mod.rs b/virtio-devices/src/vsock/mod.rs index 8558a89e4..616f0c18a 100644 --- a/virtio-devices/src/vsock/mod.rs +++ b/virtio-devices/src/vsock/mod.rs @@ -16,6 +16,7 @@ mod unix; use std::os::unix::io::RawFd; use packet::VsockPacket; +use thiserror::Error; pub use self::device::Vsock; pub use self::unix::{VsockUnixBackend, VsockUnixError}; @@ -63,29 +64,43 @@ mod defs { } } -#[derive(Debug)] +#[derive(Debug, Error)] pub enum VsockError { /// The vsock data/buffer virtio descriptor length is smaller than expected. + #[error("The vsock data/buffer virtio descriptor length is smaller than expected")] BufDescTooSmall, /// The vsock data/buffer virtio descriptor is expected, but missing. + #[error("The vsock data/buffer virtio descriptor is expected, but missing")] BufDescMissing, /// Chained GuestMemory error. + #[error("Guest memory error")] GuestMemory, + /// Chained GuestMemory access error. + #[error("Guest memory access error")] + GuestMemoryAccess(#[source] vm_memory::GuestMemoryError), /// Bounds check failed on guest memory pointer. + #[error("Bounds check failed on guest memory pointer")] GuestMemoryBounds, /// The vsock header descriptor length is too small. + #[error("The vsock header descriptor length is too small: {0}")] HdrDescTooSmall(u32), /// The vsock header descriptor is expected, but missing. + #[error("The vsock header descriptor is expected, but missing")] HdrDescMissing, /// The vsock header `len` field holds an invalid value. + #[error("The vsock header len field holds an invalid value: {0}")] InvalidPktLen(u32), /// A data fetch was attempted when no data was available. + #[error("A data fetch was attempted when no data was available")] NoData, /// A data buffer was expected for the provided packet, but it is missing. + #[error("A data buffer was expected for the provided packet, but it is missing")] PktBufMissing, /// Encountered an unexpected write-only virtio descriptor. + #[error("Encountered an unexpected write-only virtio descriptor")] UnreadableDescriptor, /// Encountered an unexpected read-only virtio descriptor. + #[error("Encountered an unexpected read-only virtio descriptor")] UnwritableDescriptor, } type Result = std::result::Result; diff --git a/virtio-devices/src/vsock/packet.rs b/virtio-devices/src/vsock/packet.rs index 4b2c60ad4..35411b251 100644 --- a/virtio-devices/src/vsock/packet.rs +++ b/virtio-devices/src/vsock/packet.rs @@ -290,7 +290,7 @@ impl VsockPacket { desc_chain .memory() .read_slice(hdr.as_mut_slice(), guest_hdr_addr) - .map_err(|_| VsockError::GuestMemory)?; + .map_err(VsockError::GuestMemoryAccess)?; let mut pkt = Self { guest_hdr_addr, @@ -361,7 +361,7 @@ impl VsockPacket { desc_chain .memory() .read_slice(&mut owned[offset..offset + to_copy], desc.addr()) - .map_err(|_| VsockError::GuestMemory)?; + .map_err(VsockError::GuestMemoryAccess)?; offset += to_copy; } @@ -435,7 +435,7 @@ impl VsockPacket { desc_chain .memory() .read_slice(hdr.as_mut_slice(), guest_hdr_addr) - .map_err(|_| VsockError::GuestMemory)?; + .map_err(VsockError::GuestMemoryAccess)?; // Prior to Linux v6.3 there are two descriptors let (buf_size, buf_addr) = if head.has_next() { @@ -506,7 +506,7 @@ impl VsockPacket { guest_mem .write(self.hdr(), self.guest_hdr_addr) - .map_err(|_| VsockError::GuestMemory)?; + .map_err(VsockError::GuestMemoryAccess)?; Ok(()) }