From 6a1fe123c25aa62a3b25e3f46d0b11c53ecba55b Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Wed, 6 May 2026 14:18:40 +0100 Subject: [PATCH] virtio-devices: mem: Handle descriptor parse errors gracefully MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A malformed descriptor chain — wrong read/write flags, missing descriptors, or undersized buffers — caused Request::parse to return an error that killed the device thread. Log a warning, report the chain as used with zero length, and continue processing. Signed-off-by: Rob Bradford Assisted-by: Claude:claude-opus-4-6 --- virtio-devices/src/mem.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index ba6ce41ed..c683450de 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -631,7 +631,17 @@ impl MemEpollHandler { let mut used_descs = false; while let Some(mut desc_chain) = self.queue.pop_descriptor_chain(self.mem.memory()) { - let r = Request::parse(&mut desc_chain)?; + let r = match Request::parse(&mut desc_chain) { + Ok(r) => r, + Err(e) => { + warn!("Failed to parse virtio-mem request: {e}"); + self.queue + .add_used(desc_chain.memory(), desc_chain.head_index(), 0) + .map_err(Error::QueueAddUsed)?; + used_descs = true; + continue; + } + }; let (resp_type, resp_state) = match r.req.req_type { VIRTIO_MEM_REQ_PLUG => ( self.state_change_request(r.req.addr, r.req.nb_blocks, true),