Skip to content

Commit f82940e

Browse files
authored
fix: bugs with CLONE_*_SETTID (#97)
* fix: replace `UserPtr` with starry-vm in sys_clone * fix: tolerate PARENT_SETTID failure
1 parent 759a887 commit f82940e

File tree

3 files changed

+10
-17
lines changed

3 files changed

+10
-17
lines changed

api/src/syscall/task/clone.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use starry_core::{
1313
};
1414
use starry_process::Pid;
1515
use starry_signal::Signo;
16+
use starry_vm::VmMutPtr;
1617

1718
use crate::{
1819
file::{FD_TABLE, FileLike, PidFd},
19-
mm::UserPtr,
2020
task::new_user_task,
2121
};
2222

@@ -128,9 +128,9 @@ pub fn sys_clone(
128128
new_uctx.set_retval(0);
129129

130130
let set_child_tid = if flags.contains(CloneFlags::CHILD_SETTID) {
131-
Some(UserPtr::<u32>::from(child_tid).get_as_mut()?)
131+
child_tid
132132
} else {
133-
None
133+
0
134134
};
135135

136136
let curr = current();
@@ -140,7 +140,7 @@ pub fn sys_clone(
140140

141141
let tid = new_task.id().as_u64() as Pid;
142142
if flags.contains(CloneFlags::PARENT_SETTID) {
143-
*UserPtr::<Pid>::from(parent_tid).get_as_mut()? = tid;
143+
(parent_tid as *mut Pid).vm_write(tid).ok();
144144
}
145145

146146
let new_proc_data = if flags.contains(CloneFlags::THREAD) {
@@ -214,7 +214,7 @@ pub fn sys_clone(
214214

215215
if flags.contains(CloneFlags::PIDFD) {
216216
let pidfd = PidFd::new(&new_proc_data);
217-
*UserPtr::<i32>::from(parent_tid).get_as_mut()? = pidfd.add_to_fd_table(true)?;
217+
(parent_tid as *mut i32).vm_write(pidfd.add_to_fd_table(true)?)?;
218218
}
219219

220220
let thr = Thread::new(tid, new_proc_data);

api/src/task.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use bytemuck::AnyBitPattern;
77
use linux_raw_sys::general::ROBUST_LIST_LIMIT;
88
use starry_core::{
99
futex::FutexKey,
10-
mm::access_user_memory,
1110
shm::SHM_MANAGER,
1211
task::{
1312
AsThread, get_process_data, get_task, send_signal_to_process, send_signal_to_thread,
@@ -25,20 +24,14 @@ use crate::{
2524
};
2625

2726
/// Create a new user task.
28-
pub fn new_user_task(
29-
name: &str,
30-
mut uctx: UserContext,
31-
set_child_tid: Option<&'static mut Pid>,
32-
) -> TaskInner {
27+
pub fn new_user_task(name: &str, mut uctx: UserContext, set_child_tid: usize) -> TaskInner {
3328
TaskInner::new(
3429
move || {
3530
let curr = axtask::current();
3631

37-
access_user_memory(|| {
38-
if let Some(tid) = set_child_tid {
39-
*tid = curr.id().as_u64() as Pid;
40-
}
41-
});
32+
if let Some(tid) = (set_child_tid as *mut Pid).nullable() {
33+
tid.vm_write(curr.id().as_u64() as Pid).ok();
34+
}
4235

4336
info!("Enter user space: ip={:#x}, sp={:#x}", uctx.ip(), uctx.sp());
4437

src/entry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub fn run_initproc(args: &[String], envs: &[String]) -> i32 {
3636

3737
let uctx = UserContext::new(entry_vaddr.into(), ustack_top, 0);
3838

39-
let mut task = new_user_task(name, uctx, None);
39+
let mut task = new_user_task(name, uctx, 0);
4040
task.ctx_mut().set_page_table_root(uspace.page_table_root());
4141

4242
let pid = task.id().as_u64() as Pid;

0 commit comments

Comments
 (0)