Zbigniew Jędrzejewski-Szmek 62fe94
From 1dedb74a2e1d840b531b76b01a76979f3b57456b Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Tue, 26 Aug 2014 21:04:21 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] util: reset signals when we fork off agents
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
If we invoke agents, we should make sure we actually can kill them
Zbigniew Jędrzejewski-Szmek 62fe94
again. I mean, it's probably not our job to cleanup the signals if our
Zbigniew Jędrzejewski-Szmek 62fe94
tools are invoked in weird contexts, but at least we should make sure,
Zbigniew Jędrzejewski-Szmek 62fe94
that the subprocesses we invoke and intend to control work as intended.
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Also see:
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
http://lists.freedesktop.org/archives/systemd-devel/2014-August/022460.html
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/util.c | 18 ++++++++++++++++++
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/util.h |  1 +
Zbigniew Jędrzejewski-Szmek 62fe94
 2 files changed, 19 insertions(+)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/util.c b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 4af2d3ceba..98c07163da 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -959,6 +959,18 @@ int reset_all_signal_handlers(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return r;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+int reset_signal_mask(void) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        sigset_t ss;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (sigemptyset(&ss) < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return -errno;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return -errno;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 char *strstrip(char *s) {
Zbigniew Jędrzejewski-Szmek 62fe94
         char *e;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -5131,6 +5143,12 @@ int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *pa
Zbigniew Jędrzejewski-Szmek 62fe94
         /* Don't leak fds to the agent */
Zbigniew Jędrzejewski-Szmek 62fe94
         close_all_fds(except, n_except);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        /* Make sure we actually can kill the agent, if we need to, in
Zbigniew Jędrzejewski-Szmek 62fe94
+         * case somebody invoked us from a shell script that trapped
Zbigniew Jędrzejewski-Szmek 62fe94
+         * SIGTERM or so... */
Zbigniew Jędrzejewski-Szmek 62fe94
+        reset_all_signal_handlers();
Zbigniew Jędrzejewski-Szmek 62fe94
+        reset_signal_mask();
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         stdout_is_tty = isatty(STDOUT_FILENO);
Zbigniew Jędrzejewski-Szmek 62fe94
         stderr_is_tty = isatty(STDERR_FILENO);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/util.h b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 62fe94
index cd947dbbef..ea87c96956 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -274,6 +274,7 @@ int readlink_and_make_absolute(const char *p, char **r);
Zbigniew Jędrzejewski-Szmek 62fe94
 int readlink_and_canonicalize(const char *p, char **r);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 int reset_all_signal_handlers(void);
Zbigniew Jędrzejewski-Szmek 62fe94
+int reset_signal_mask(void);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 char *strstrip(char *s);
Zbigniew Jędrzejewski-Szmek 62fe94
 char *delete_chars(char *s, const char *bad);