utrace: Forward SIGTERM to the traced process
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 12 Sep 2017 11:12:47 +0000 (13:12 +0200)
committerJohn Crispin <john@phrozen.org>
Thu, 28 Sep 2017 06:26:56 +0000 (08:26 +0200)
When a service is started with "/etc/init.d/<service> trace" or when
it has seccomp enabled (i.e. runs under seccomp-trace), stopping the
service with "/etc/init.d/<service> stop" stops only the tracer. The
service itself continue executing. This patch ensures that the service
is terminated as well.

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

index 7fe55990e3ca53d00d347337ea6025632ee798ca..d878a65277e1192c9dd66ec2281dc97126821b05 100644 (file)
@@ -263,6 +263,15 @@ static void tracer_cb(struct uloop_process *c, int ret)
        uloop_process_add(c);
 }
 
+static void sigterm_handler(int signum)
+{
+       /* When we receive SIGTERM, we forward it to the tracee. After
+        * the tracee exits, trace_cb() will be called and make us
+        * exit too. */
+       kill(tracer.proc.pid, SIGTERM);
+}
+
+
 int main(int argc, char **argv, char **envp)
 {
        int status, ch, policy = EPERM;
@@ -370,6 +379,7 @@ int main(int argc, char **argv, char **envp)
        tracer.proc.pid = child;
        tracer.proc.cb = tracer_cb;
        uloop_process_add(&tracer.proc);
+       signal(SIGTERM, sigterm_handler); /* Override uloop's SIGTERM handler */
        uloop_run();
        uloop_done();