Explorar el Código

fix(set_robust_list): postpone the reading of robust_list_head until we exit

greatbridf hace 7 meses
padre
commit
990e1c6ad8
Se han modificado 2 ficheros con 12 adiciones y 11 borrados
  1. 3 5
      src/kernel/syscall/procops.rs
  2. 9 6
      src/kernel/task/thread.rs

+ 3 - 5
src/kernel/syscall/procops.rs

@@ -25,7 +25,7 @@ use bitflags::bitflags;
 use core::ptr::NonNull;
 use eonix_hal::processor::UserTLS;
 use eonix_hal::traits::trap::RawTrapContext;
-use eonix_mm::address::Addr as _;
+use eonix_mm::address::{Addr as _, VAddr};
 use eonix_runtime::task::Task;
 use eonix_sync::AsProof as _;
 use posix_types::constants::{P_ALL, P_PID};
@@ -766,14 +766,12 @@ fn futex(
 }
 
 #[eonix_macros::define_syscall(SYS_SET_ROBUST_LIST)]
-fn set_robust_list(head: *const RobustListHead, len: usize) -> KResult<()> {
+fn set_robust_list(head: usize, len: usize) -> KResult<()> {
     if len != size_of::<RobustListHead>() {
         return Err(EINVAL);
     }
 
-    let robust_list_head = UserPointer::new(head)?.read()?;
-
-    thread.set_robust_list(Some(robust_list_head));
+    thread.set_robust_list(Some(VAddr::from(head)));
     Ok(())
 }
 

+ 9 - 6
src/kernel/task/thread.rs

@@ -8,7 +8,7 @@ use crate::{
         syscall::{syscall_handlers, SyscallHandler},
         task::{clone::CloneArgs, futex::RobustListHead, CloneFlags},
         timer::{should_reschedule, timer_interrupt},
-        user::UserPointerMut,
+        user::{UserPointer, UserPointerMut},
         vfs::{filearray::FileArray, FsContext},
     },
     prelude::*,
@@ -75,7 +75,7 @@ struct ThreadInner {
 
     clear_child_tid: Option<usize>,
 
-    robust_list: Option<RobustListHead>,
+    robust_list_address: Option<VAddr>,
 }
 
 pub struct Thread {
@@ -253,7 +253,7 @@ impl ThreadBuilder {
                 tls: self.tls,
                 set_child_tid: self.set_child_tid,
                 clear_child_tid: self.clear_child_tid,
-                robust_list: None,
+                robust_list_address: None,
             }),
         });
 
@@ -291,12 +291,15 @@ impl Thread {
         Ok(())
     }
 
-    pub fn set_robust_list(&self, robust_list: Option<RobustListHead>) {
-        self.inner.lock().robust_list = robust_list;
+    pub fn set_robust_list(&self, robust_list_address: Option<VAddr>) {
+        self.inner.lock().robust_list_address = robust_list_address;
     }
 
     pub fn get_robust_list(&self) -> Option<RobustListHead> {
-        self.inner.lock().robust_list
+        let addr = self.inner.lock().robust_list_address?;
+        let user_pointer = UserPointer::new(addr.addr() as *const RobustListHead).ok()?;
+
+        user_pointer.read().ok()
     }
 
     pub fn set_name(&self, name: Arc<[u8]>) {