utrace: Deliver signals to traced processes
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 12 Sep 2017 11:12:40 +0000 (13:12 +0200)
committerJohn Crispin <john@phrozen.org>
Thu, 28 Sep 2017 06:26:56 +0000 (08:26 +0200)
Without this change, traced processes do not receive any signal,
because all the signals are "eaten" by the tracer.

Signed-off-by: Michal Sojka <sojkam1@fel.cvut.cz>
trace/trace.c

index 4c25a4f..cad2d37 100644 (file)
@@ -148,6 +148,7 @@ static void print_syscalls(int policy, const char *json)
 static void tracer_cb(struct uloop_process *c, int ret)
 {
        struct tracee *tracee = container_of(c, struct tracee, proc);
 static void tracer_cb(struct uloop_process *c, int ret)
 {
        struct tracee *tracee = container_of(c, struct tracee, proc);
+       int inject_signal = 0;
 
        if (WIFSTOPPED(ret)) {
                if (WSTOPSIG(ret) & 0x80) {
 
        if (WIFSTOPPED(ret)) {
                if (WSTOPSIG(ret) & 0x80) {
@@ -174,8 +175,13 @@ static void tracer_cb(struct uloop_process *c, int ret)
                        uloop_process_add(&child->proc);
                        if (debug)
                                fprintf(stderr, "Tracing new child %d\n", child->proc.pid);
                        uloop_process_add(&child->proc);
                        if (debug)
                                fprintf(stderr, "Tracing new child %d\n", child->proc.pid);
+               } else {
+                       inject_signal = WSTOPSIG(ret);
+                       if (debug)
+                               fprintf(stderr, "Injecting signal %d into pid %d\n",
+                                       inject_signal, tracee->proc.pid);
                }
                }
-       } else if (WIFEXITED(ret)) {
+       } else if (WIFEXITED(ret) || (WIFSIGNALED(ret) && WTERMSIG(ret))) {
                if (tracee == &tracer) {
                        uloop_end(); /* Main process exit */
                } else {
                if (tracee == &tracer) {
                        uloop_end(); /* Main process exit */
                } else {
@@ -186,7 +192,7 @@ static void tracer_cb(struct uloop_process *c, int ret)
                return;
        }
 
                return;
        }
 
-       ptrace(PTRACE_SYSCALL, c->pid, 0, 0);
+       ptrace(PTRACE_SYSCALL, c->pid, 0, inject_signal);
        uloop_process_add(c);
 }
 
        uloop_process_add(c);
 }