From 084d7ed082210a9a9716851b77817c1f4aa4a315 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 11 Nov 2024 06:20:17 +0200 Subject: [PATCH] console: specify unknown event in HandleEventUnknown Since we know the unknown event value, we might as well specify it in the error message of Error::HandleEventUnknown to help users and developers. While at it, return an error when trying to access vrings with `device_event` >= QUEUE_SIZE. Signed-off-by: Manos Pitsidianakis --- vhost-device-console/src/vhu_console.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/vhost-device-console/src/vhu_console.rs b/vhost-device-console/src/vhu_console.rs index 16a732e..a801a5b 100644 --- a/vhost-device-console/src/vhu_console.rs +++ b/vhost-device-console/src/vhu_console.rs @@ -63,8 +63,8 @@ type Result = std::result::Result; #[derive(Copy, Clone, Debug, PartialEq, ThisError)] pub(crate) enum Error { - #[error("Failed to handle unknown event")] - HandleEventUnknown, + #[error("Failed to handle unknown event: {0}")] + HandleEventUnknown(u16), #[error("Descriptor not found")] DescriptorNotFound, #[error("Failed to send notification")] @@ -351,9 +351,9 @@ impl VhostUserConsoleBackend { VIRTIO_CONSOLE_PORT_OPEN => { trace!("VIRTIO_CONSOLE_PORT_OPEN"); } - _ => { - trace!("Uknown control event"); - return Err(Error::HandleEventUnknown); + other => { + trace!("Uknown control event: {}", other); + return Err(Error::HandleEventUnknown(other)); } }; Ok(()) @@ -742,8 +742,10 @@ impl VhostUserBackendMut for VhostUserConsoleBackend { &vrings[RX_QUEUE as usize] } else if device_event == BACKEND_CTRL_RX_EFD { &vrings[CTRL_RX_QUEUE as usize] - } else { + } else if (device_event as usize) < NUM_QUEUES { &vrings[device_event as usize] + } else { + return Err(Error::HandleEventUnknown(device_event).into()); }; if self.event_idx { @@ -777,7 +779,7 @@ impl VhostUserBackendMut for VhostUserConsoleBackend { let _ = self.rx_ctrl_event.read(); self.process_ctrl_rx_queue(vring) } - _ => Err(Error::HandleEventUnknown), + other => Err(Error::HandleEventUnknown(other)), }?; if !vring.enable_notification().unwrap() { break; @@ -800,7 +802,7 @@ impl VhostUserBackendMut for VhostUserConsoleBackend { let _ = self.rx_ctrl_event.read(); self.process_ctrl_rx_queue(vring) } - _ => Err(Error::HandleEventUnknown), + other => Err(Error::HandleEventUnknown(other)), }?; } Ok(()) @@ -1097,7 +1099,7 @@ mod tests { vu_console_backend .handle_control_msg(ctrl_msg_err) .unwrap_err(), - Error::HandleEventUnknown + Error::HandleEventUnknown(4) ); assert!(vu_console_backend.handle_control_msg(ctrl_msg_1).is_ok());