[PATCH v2 19/28] um: Pass full mm_id to functions creating helper processes
benjamin at sipsolutions.net
benjamin at sipsolutions.net
Tue Nov 22 02:07:50 PST 2022
From: Benjamin Berg <benjamin at 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 <benjamin at 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
More information about the linux-um
mailing list