fix(xenbus): avoid fd close race by forgetting copy of handle

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.
This commit is contained in:
Khionu Sybiern 2024-08-07 16:27:41 -07:00
parent 680244fc5e
commit 0d3c942492
No known key found for this signature in database

View File

@ -116,9 +116,11 @@ impl XsdSocket {
let rx_task = std::thread::Builder::new() let rx_task = std::thread::Builder::new()
.name("xenstore-reader".to_string()) .name("xenstore-reader".to_string())
.spawn(move || { .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); debug!("failed to process xen store bus: {}", error);
} }
std::mem::forget(read);
})?; })?;
Ok(XsdSocket { Ok(XsdSocket {
@ -197,12 +199,12 @@ struct XsdSocketProcessor {
} }
impl XsdSocketProcessor { impl XsdSocketProcessor {
fn process_rx(mut read: std::fs::File, rx_sender: Sender<XsdMessage>) -> Result<()> { fn process_rx(read: &mut std::fs::File, rx_sender: Sender<XsdMessage>) -> Result<()> {
let mut header_buffer: Vec<u8> = vec![0u8; XsdMessageHeader::SIZE]; let mut header_buffer: Vec<u8> = vec![0u8; XsdMessageHeader::SIZE];
let mut buffer: Vec<u8> = vec![0u8; XEN_BUS_MAX_PACKET_SIZE - XsdMessageHeader::SIZE]; let mut buffer: Vec<u8> = vec![0u8; XEN_BUS_MAX_PACKET_SIZE - XsdMessageHeader::SIZE];
loop { loop {
let message = 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)?; rx_sender.blocking_send(message)?;
} }
} }