From 44629e4627dc7113fa78bd07bc6853afcd750d85 Mon Sep 17 00:00:00 2001 From: Marsman1996 Date: Sat, 14 Sep 2024 17:02:57 +0800 Subject: [PATCH] Fix panic in FutexKey::load_val when no read access --- kernel/src/process/posix_thread/futex.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kernel/src/process/posix_thread/futex.rs b/kernel/src/process/posix_thread/futex.rs index e1b75c28c..53d76bf74 100644 --- a/kernel/src/process/posix_thread/futex.rs +++ b/kernel/src/process/posix_thread/futex.rs @@ -41,8 +41,11 @@ pub fn futex_wait_bitset( // lock futex bucket ref here to avoid data race let mut futex_bucket = futex_bucket_ref.lock(); - if futex_key.load_val() != futex_val { - return_errno_with_message!(Errno::EAGAIN, "futex value does not match"); + if !futex_key.load_val().is_ok_and(|val| val == futex_val) { + return_errno_with_message!( + Errno::EAGAIN, + "futex value does not match or load_val failed" + ); } futex_bucket.add_item(futex_item); @@ -327,10 +330,10 @@ impl FutexKey { Self { addr, bitset } } - pub fn load_val(&self) -> i32 { + pub fn load_val(&self) -> Result { // FIXME: how to implement a atomic load? warn!("implement an atomic load"); - CurrentUserSpace::get().read_val(self.addr).unwrap() + CurrentUserSpace::get().read_val(self.addr) } pub fn addr(&self) -> Vaddr {