Use atomic counter in UDS to avoid race condition

This commit is contained in:
Wildan Mubarok
2025-10-21 15:20:50 +00:00
parent 47f056490f
commit 6dddb01d63
+6 -9
View File
@@ -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<usize, Rc<RefCell<Socket>>>,
next_id: usize,
next_id: AtomicUsize,
socket_paths: HashMap<String, Rc<RefCell<Socket>>>,
socket_tokens: HashMap<u64, Rc<RefCell<Socket>>>,
socket: &'sock SchemeSocket,
@@ -122,7 +123,7 @@ impl<'sock> UdsDgramScheme<'sock> {
pub fn new(socket: &'sock SchemeSocket) -> Result<Self> {
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<OpenResult> {
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<OpenResult> {
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,