summaryrefslogtreecommitdiff
path: root/exec/trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'exec/trace.c')
-rw-r--r--exec/trace.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/exec/trace.c b/exec/trace.c
index b0ec602d821..2421785a80a 100644
--- a/exec/trace.c
+++ b/exec/trace.c
@@ -1246,7 +1246,11 @@ process_system_call (struct exec_tracee *tracee)
set, this must be exec, whatever the value of SYSCALL_NUM_REG,
which is erased when exec loads another image. */
- callno = (!tracee->exec_data ? regs.SYSCALL_NUM_REG : EXEC_SYSCALL);
+ callno = (!tracee->exec_data
+ ? (!tracee->waiting_for_syscall
+ ? regs.SYSCALL_NUM_REG : tracee->callno)
+ : EXEC_SYSCALL);
+ tracee->callno = callno;
switch (callno)
{
case EXEC_SYSCALL:
@@ -1653,6 +1657,11 @@ seccomp_system_call (struct exec_tracee *tracee)
/* Now dispatch based on the system call. */
callno = regs.SYSCALL_NUM_REG;
+
+ /* Record the call number, which may be required if one of the
+ following handlers should arrange for process_system_call to
+ intercede after the system call completes. */
+ tracee->callno = callno;
switch (callno)
{
case EXEC_SYSCALL:
@@ -1715,7 +1724,7 @@ seccomp_system_call (struct exec_tracee *tracee)
if (rc < 0)
return;
- tracee->waiting_for_syscall = !tracee->waiting_for_syscall;
+ tracee->waiting_for_syscall = true;
break;
default:
@@ -2033,6 +2042,7 @@ after_fork (pid_t pid)
return 1;
tracee->pid = pid;
+ tracee->callno = 0;
tracee->next = tracing_processes;
tracee->waiting_for_syscall = false;
tracee->new_child = false;