From: Benjamin Berg <benja...@sipsolutions.net> For seccomp, we need all information about the original process in copy_context_skas0. For consistency, change both copy_context_skas0 and start_userspace to take the mm_id struct as parameter and directly set PID in addition to returning it.
Signed-off-by: Benjamin Berg <benja...@sipsolutions.net> --- arch/um/include/shared/os.h | 4 +-- arch/um/kernel/skas/mmu.c | 10 +++--- arch/um/os-Linux/skas/process.c | 57 ++++++++++++++++----------------- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 22ea525165b7..d1f1dedad83b 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -282,8 +282,8 @@ void protect(struct mm_id *mm_idp, unsigned long addr, /* skas/process.c */ extern int is_skas_winch(int pid, int fd, void *data); -extern int start_userspace(unsigned long stub_stack); -extern int copy_context_skas0(unsigned long stack, int pid); +extern int start_userspace(struct mm_id *id); +extern int copy_context_skas0(struct mm_id *id, struct mm_id *from); extern void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs); extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void)); extern void switch_threads(jmp_buf *me, jmp_buf *you); diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 6ccb561b4373..d5838ff702dc 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c @@ -31,15 +31,13 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm) block_signals_trace(); if (from_mm) - to_mm->id.u.pid = copy_context_skas0(stack, - from_mm->id.u.pid); - else to_mm->id.u.pid = start_userspace(stack); + ret = copy_context_skas0(&to_mm->id, &from_mm->id); + else + ret = start_userspace(&to_mm->id); unblock_signals_trace(); - if (to_mm->id.u.pid < 0) { - ret = to_mm->id.u.pid; + if (ret < 0) goto out_free; - } ret = init_new_ldt(to_mm, from_mm); if (ret < 0) { diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 17164c4a7d7c..1e1c378588ba 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -267,11 +267,11 @@ int kill_userspace_mm[NR_CPUS]; * when negative: an error number. * FIXME: can PIDs become negative?! */ -int start_userspace(unsigned long stub_stack) +int start_userspace(struct mm_id *id) { void *stack; unsigned long sp; - int pid, status, n, flags, err; + int status, n, flags, err; /* setup a temporary stack page */ stack = mmap(NULL, UM_KERN_PAGE_SIZE, @@ -290,8 +290,8 @@ int start_userspace(unsigned long stub_stack) flags = CLONE_FILES | SIGCHLD; /* clone into new userspace process */ - pid = clone(userspace_tramp, (void *) sp, flags, (void *) stub_stack); - if (pid < 0) { + id->u.pid = clone(userspace_tramp, (void *) sp, flags, (void *) id->stack); + if (id->u.pid < 0) { err = -errno; printk(UM_KERN_ERR "%s : clone failed, errno = %d\n", __func__, errno); @@ -299,7 +299,7 @@ int start_userspace(unsigned long stub_stack) } do { - CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL)); + CATCH_EINTR(n = waitpid(id->u.pid, &status, WUNTRACED | __WALL)); if (n < 0) { err = -errno; printk(UM_KERN_ERR "%s : wait failed, errno = %d\n", @@ -315,7 +315,7 @@ int start_userspace(unsigned long stub_stack) goto out_kill; } - if (ptrace(PTRACE_SETOPTIONS, pid, NULL, + if (ptrace(PTRACE_SETOPTIONS, id->u.pid, NULL, (void *) PTRACE_O_TRACESYSGOOD) < 0) { err = -errno; printk(UM_KERN_ERR "%s : PTRACE_SETOPTIONS failed, errno = %d\n", @@ -330,10 +330,10 @@ int start_userspace(unsigned long stub_stack) goto out_kill; } - return pid; + return id->u.pid; out_kill: - os_kill_ptraced_process(pid, 1); + os_kill_ptraced_process(id->u.pid, 1); return err; } @@ -483,15 +483,14 @@ static int __init init_thread_regs(void) __initcall(init_thread_regs); -int copy_context_skas0(unsigned long new_stack, int pid) +int copy_context_skas0(struct mm_id *id, struct mm_id *from) { int err; unsigned long current_stack = current_stub_stack(); - struct stub_data *data = (struct stub_data *) current_stack; - struct stub_data *child_data = (struct stub_data *) new_stack; + struct stub_data *data = (struct stub_data *)current_stack; + struct stub_data *child_data = (struct stub_data *)id->stack; unsigned long long new_offset; - int new_fd = phys_mapping(uml_to_phys((void *)new_stack), &new_offset); - + int new_fd = phys_mapping(uml_to_phys((void *)id->stack), &new_offset); /* * prepare offset and fd of child's stack as argument for parent's * and child's mmap2 calls @@ -507,18 +506,18 @@ int copy_context_skas0(unsigned long new_stack, int pid) .child_err = -ESRCH, }); - err = ptrace_setregs(pid, thread_regs); + err = ptrace_setregs(from->u.pid, thread_regs); if (err < 0) { err = -errno; printk(UM_KERN_ERR "%s : PTRACE_SETREGS failed, pid = %d, errno = %d\n", - __func__, pid, -err); + __func__, from->u.pid, -err); return err; } - err = put_fp_registers(pid, thread_fp_regs); + err = put_fp_registers(from->u.pid, thread_fp_regs); if (err < 0) { printk(UM_KERN_ERR "%s : put_fp_registers failed, pid = %d, err = %d\n", - __func__, pid, err); + __func__, from->u.pid, err); return err; } @@ -526,36 +525,36 @@ int copy_context_skas0(unsigned long new_stack, int pid) * Wait, until parent has finished its work: read child's pid from * parent's stack, and check, if bad result. */ - err = ptrace(PTRACE_CONT, pid, 0, 0); + err = ptrace(PTRACE_CONT, from->u.pid, 0, 0); if (err) { err = -errno; printk(UM_KERN_ERR "Failed to continue new process, pid = %d, errno = %d\n", - pid, errno); + from->u.pid, errno); return err; } - wait_stub_done(pid); + wait_stub_done(from->u.pid); - pid = data->err; - if (pid < 0) { + id->u.pid = data->err; + if (id->u.pid < 0) { printk(UM_KERN_ERR "%s - stub-parent reports error %d\n", - __func__, -pid); - return pid; + __func__, -id->u.pid); + return id->u.pid; } /* * Wait, until child has finished too: read child's result from * child's stack and check it. */ - wait_stub_done(pid); + wait_stub_done(id->u.pid); if (child_data->child_err != STUB_DATA) { printk(UM_KERN_ERR "%s - stub-child %d reports error %ld\n", - __func__, pid, data->child_err); + __func__, id->u.pid, data->child_err); err = data->child_err; goto out_kill; } - if (ptrace(PTRACE_SETOPTIONS, pid, NULL, + if (ptrace(PTRACE_SETOPTIONS, id->u.pid, NULL, (void *)PTRACE_O_TRACESYSGOOD) < 0) { err = -errno; printk(UM_KERN_ERR "%s : PTRACE_SETOPTIONS failed, errno = %d\n", @@ -563,10 +562,10 @@ int copy_context_skas0(unsigned long new_stack, int pid) goto out_kill; } - return pid; + return id->u.pid; out_kill: - os_kill_ptraced_process(pid, 1); + os_kill_ptraced_process(id->u.pid, 1); return err; } -- 2.38.1 _______________________________________________ linux-um mailing list linux-um@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-um