From 21be28b24b0ee5ea97f3752c00f3f740ffb5f6b6 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 31 May 2020 23:59:13 +0200 Subject: Things work as expected again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- process.c | 27 +++++++++++++++++++-------- sctrace.c | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/process.c b/process.c index 056a103..f979e21 100644 --- a/process.c +++ b/process.c @@ -45,14 +45,25 @@ add_process(pid_t pid, unsigned long int trace_options) continue; eprintf_and_kill(pid, "waitpid %ju WSTOPPED:", (uintmax_t)pid); } - if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP) - eprintf_and_kill(pid, "unexpected return of waitpid %ju WSTOPPED:", (uintmax_t)pid); - if (ptrace(PTRACE_SEIZE, pid, 0, trace_options)) - eprintf_and_kill(pid, "ptrace PTRACE_SEIZE %ju 0 ...:", (uintmax_t)pid); - if (ptrace(PTRACE_INTERRUPT, pid, 0, 0)) - eprintf_and_kill(pid, "ptrace PTRACE_INTERRUPT %ju 0 0:", (uintmax_t)pid); - if (kill(pid, SIGCONT) < 0) - eprintf_and_kill(pid, "kill &ju SIGCONT:", (uintmax_t)pid); + + switch (status) { + case __W_STOPCODE(SIGSTOP): + if (ptrace(PTRACE_SEIZE, pid, 0, trace_options)) + eprintf_and_kill(pid, "ptrace PTRACE_SEIZE %ju 0 ...:", (uintmax_t)pid); + if (ptrace(PTRACE_INTERRUPT, pid, NULL, 0)) + eprintf_and_kill(pid, "ptrace PTRACE_INTERRUPT %ju NULL 0:", (uintmax_t)pid); + if (kill(pid, SIGCONT) < 0) + eprintf_and_kill(pid, "kill &ju SIGCONT:", (uintmax_t)pid); + break; + + case __W_STOPCODE(SIGTRAP) | (PTRACE_EVENT_STOP << 16): + if (ptrace(PTRACE_SYSCALL, pid, NULL, 0)) + eprintf_and_kill(pid, "ptrace PTRACE_SYSCALL %ju NULL 0:", (uintmax_t)pid); + break; + + default: + eprintf_and_kill(pid, "unexpected return of waitpid %ju WSTOPPED: %#x\n", (uintmax_t)pid, status); + } return proc; } diff --git a/sctrace.c b/sctrace.c index 30535fb..f86d830 100644 --- a/sctrace.c +++ b/sctrace.c @@ -157,7 +157,7 @@ handle_event(struct process *proc, int status) abort(); case 0: - /* TODO ensure proper handling of signals (multithreaded?, siginfo?, in new processes?) */ + /* TODO ensure proper handling of signals (siginfo?) */ if (ptrace(PTRACE_GETSIGINFO, proc->pid, 0, &(siginfo_t){0})) goto stop_signal; tprintf(proc, "\nProcess received signal %i (%s: %s)\n", sig, get_signum_name(sig), strsignal(sig)); -- cgit v1.2.3-70-g09d2