diff --git a/src/syscall/process.rs b/src/syscall/process.rs index c5b0038a522cfea79a1d0da683240c6267af815c..a88fdabb8e0ee845e386766e3de4fd57fcbee1b1 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -525,11 +525,8 @@ fn empty(context: &mut context::Context, reaping: bool) { drop(context.tls.take()); } - // FIXME: Looks like a race condition. - // Is it possible for Arc::strong_count to return 1 to two contexts that exit at the - // same time, or return 2 to both, thus either double freeing or leaking the grants? + let mut grants = context.grants.lock(); if Arc::strong_count(&context.grants) == 1 { - let mut grants = context.grants.lock(); for grant in grants.drain(..) { if reaping { println!("{}: {}: Grant should not exist: {:?}", context.id.into(), unsafe { ::core::str::from_utf8_unchecked(&context.name.lock()) }, grant); @@ -927,11 +924,11 @@ pub fn exit(status: usize) -> ! { let mut close_files = Vec::new(); let pid = { let mut context = context_lock.write(); - // FIXME: Looks like a race condition. - // Is it possible for Arc::strong_count to return 1 to two contexts that exit at the - // same time, or return 2 to both, thus either double closing or leaking the files? - if Arc::strong_count(&context.files) == 1 { - mem::swap(context.files.lock().deref_mut(), &mut close_files); + { + let mut lock = context.files.lock(); + if Arc::strong_count(&context.files) == 1 { + mem::swap(lock.deref_mut(), &mut close_files); + } } context.files = Arc::new(Mutex::new(Vec::new())); context.id