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 <[email protected]>
This commit is contained in:
Khionu Sybiernandalex authored and GitHub committed 2024-08-07 23:55:04 +00:00
1 parent 11bb99b1e4
commit 53059e8cca
1 file changed
+5 -3
+5 -3
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)?;
}
}