From 53059e8ccaecb02f9dd63f4ec044f47eb0a9a912 Mon Sep 17 00:00:00 2001 From: Khionu Sybiern Date: Wed, 7 Aug 2024 16:55:04 -0700 Subject: [PATCH] fix(xenbus): avoid fd close race by forgetting copy of handle (#314) This change addresses a race condition where the read-copy of a raw FD is closed while the write-copy is still in use. Now the read-copy is not closed, by utilizing mem::forget. Co-authored-by: Alex Zenla --- crates/xen/xenstore/src/bus.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/xen/xenstore/src/bus.rs b/crates/xen/xenstore/src/bus.rs index 5a890f5..1d994dc 100644 --- a/crates/xen/xenstore/src/bus.rs +++ b/crates/xen/xenstore/src/bus.rs @@ -116,9 +116,11 @@ impl XsdSocket { let rx_task = std::thread::Builder::new() .name("xenstore-reader".to_string()) .spawn(move || { - if let Err(error) = XsdSocketProcessor::process_rx(read, rx_sender) { + let mut read = read; + if let Err(error) = XsdSocketProcessor::process_rx(&mut read, rx_sender) { debug!("failed to process xen store bus: {}", error); } + std::mem::forget(read); })?; Ok(XsdSocket { @@ -197,12 +199,12 @@ struct XsdSocketProcessor { } impl XsdSocketProcessor { - fn process_rx(mut read: std::fs::File, rx_sender: Sender) -> Result<()> { + fn process_rx(read: &mut std::fs::File, rx_sender: Sender) -> Result<()> { let mut header_buffer: Vec = vec![0u8; XsdMessageHeader::SIZE]; let mut buffer: Vec = vec![0u8; XEN_BUS_MAX_PACKET_SIZE - XsdMessageHeader::SIZE]; loop { let message = - XsdSocketProcessor::read_message(&mut header_buffer, &mut buffer, &mut read)?; + XsdSocketProcessor::read_message(&mut header_buffer, &mut buffer, read)?; rx_sender.blocking_send(message)?; } }