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 <alex@edera.dev>
This commit is contained in:
Khionu Sybiern 2024-08-07 16:55:04 -07:00 committed by GitHub
parent 11bb99b1e4
commit 53059e8cca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

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)?;
} }
} }