Merge branch 'uds-race-cond' into 'main'
Use atomic counter in UDS to avoid race condition See merge request redox-os/base!32
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user