[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 26/28] linux-user: Use safe_syscall for execve sy
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v2 26/28] linux-user: Use safe_syscall for execve syscall |
Date: |
Thu, 12 May 2016 18:47:50 +0100 |
From: Timothy E Baldwin <address@hidden>
Wrap execve() in the safe-syscall handling. Although execve() is not
an interruptible syscall, it is a special case: if we allow a signal
to happen before we make the host$ syscall then we will 'lose' it,
because at the point of execve the process leaves QEMU's control. So
we use the safe syscall wrapper to ensure that we either take the
signal as a guest signal, or else it does not happen before the
execve completes and makes it the other program's problem.
The practical upshot is that without this SIGTERM could fail to
terminate the process.
Signed-off-by: Timothy Edward Baldwin <address@hidden>
Message-id: address@hidden
[PMM: expanded commit message to explain in more detail why this is
needed, and add comment about it too]
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
linux-user/syscall.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index d9f4695..dea827f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -703,6 +703,7 @@ safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int,
options, \
struct rusage *, rusage)
safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
int, options, struct rusage *, rusage)
+safe_syscall3(int, execve, const char *, filename, char **, argv, char **,
envp)
static inline int host_to_target_sock_type(int host_type)
{
@@ -6179,7 +6180,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
arg1,
if (!(p = lock_user_string(arg1)))
goto execve_efault;
- ret = get_errno(execve(p, argp, envp));
+ /* Although execve() is not an interruptible syscall it is
+ * a special case where we must use the safe_syscall wrapper:
+ * if we allow a signal to happen before we make the host
+ * syscall then we will 'lose' it, because at the point of
+ * execve the process leaves QEMU's control. So we use the
+ * safe syscall wrapper to ensure that we either take the
+ * signal as a guest signal, or else it does not happen
+ * before the execve completes and makes it the other
+ * program's problem.
+ */
+ ret = get_errno(safe_execve(p, argp, envp));
unlock_user(p, arg1, 0);
goto execve_end;
--
1.9.1
- [Qemu-devel] [PATCH v2 19/28] linux-user: Set r14 on exit from microblaze syscall, (continued)
- [Qemu-devel] [PATCH v2 19/28] linux-user: Set r14 on exit from microblaze syscall, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 12/28] linux-user: Support for restarting system calls for Alpha targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 23/28] linux-user: Use safe_syscall for read and write system calls, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 08/28] linux-user: Support for restarting system calls for MIPS targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 16/28] linux-user: Support for restarting system calls for S390 targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 03/28] linux-user: Reindent signal handling, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 10/28] linux-user: Support for restarting system calls for SPARC targets, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 26/28] linux-user: Use safe_syscall for execve syscall,
Peter Maydell <=
- [Qemu-devel] [PATCH v2 28/28] linux-user: Use safe_syscall for futex syscall, Peter Maydell, 2016/05/12
- [Qemu-devel] [PATCH v2 21/28] linux-user: Add debug code to exercise restarting system calls, Peter Maydell, 2016/05/12
- Re: [Qemu-devel] [PATCH v2 00/28] linux-user: fix race between signals and syscalls, Peter Maydell, 2016/05/23
- Re: [Qemu-devel] [PATCH v2 00/28] linux-user: fix race between signals and syscalls, Riku Voipio, 2016/05/24