From 6dddb01d63e0ed1e4170e8d384ff517c145686cb Mon Sep 17 00:00:00 2001 From: Wildan Mubarok Date: Tue, 21 Oct 2025 15:20:50 +0000 Subject: [PATCH] Use atomic counter in UDS to avoid race condition --- ipcd/src/uds/dgram.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ipcd/src/uds/dgram.rs b/ipcd/src/uds/dgram.rs index d2077571c4..66be7f1490 100644 --- a/ipcd/src/uds/dgram.rs +++ b/ipcd/src/uds/dgram.rs @@ -13,6 +13,7 @@ use redox_scheme::{ scheme::SchemeSync, CallerCtx, OpenResult, RecvFdRequest, Response, SendFdRequest, SignalBehavior, Socket as SchemeSocket, }; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::{ cell::RefCell, cmp, @@ -110,7 +111,7 @@ impl Socket { pub struct UdsDgramScheme<'sock> { sockets: HashMap>>, - next_id: usize, + next_id: AtomicUsize, socket_paths: HashMap>>, socket_tokens: HashMap>>, socket: &'sock SchemeSocket, @@ -122,7 +123,7 @@ impl<'sock> UdsDgramScheme<'sock> { pub fn new(socket: &'sock SchemeSocket) -> Result { Ok(Self { sockets: HashMap::new(), - next_id: 0, + next_id: 0.into(), socket_paths: HashMap::new(), socket_tokens: HashMap::new(), socket, @@ -172,13 +173,12 @@ impl<'sock> UdsDgramScheme<'sock> { } fn handle_unnamed_socket(&mut self, flags: usize) -> usize { - let new_id = self.next_id; + let new_id = self.next_id.fetch_add(1, Ordering::SeqCst); let mut new = Socket::default(); new.flags = flags; new.primary_id = new_id; self.sockets.insert(new_id, Rc::new(RefCell::new(new))); - self.next_id += 1; new_id } @@ -435,7 +435,7 @@ impl<'sock> UdsDgramScheme<'sock> { } fn handle_connect_socketpair(&mut self, id: usize) -> Result { - let new_id = self.next_id; + let new_id = self.next_id.fetch_add(1, Ordering::SeqCst); let mut new = Socket::default(); new.primary_id = new_id; @@ -462,8 +462,6 @@ impl<'sock> UdsDgramScheme<'sock> { self.sockets.insert(new_id, Rc::new(RefCell::new(new))); - self.next_id += 1; - Ok(OpenResult::ThisScheme { number: new_id, flags: NewFdFlags::empty(), @@ -481,10 +479,9 @@ impl<'sock> UdsDgramScheme<'sock> { fn handle_listen(&mut self, id: usize) -> Result { let socket_rc = self.get_socket(id)?; - let new_id = self.next_id; + let new_id = self.next_id.fetch_add(1, Ordering::SeqCst); self.sockets.insert(new_id, socket_rc.clone()); - self.next_id += 1; Ok(OpenResult::ThisScheme { number: new_id,