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()
.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<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 buffer: Vec<u8> = 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)?;
}
}