chiark / gitweb /
util: reset signals when we fork off agents
authorLennart Poettering <lennart@poettering.net>
Tue, 26 Aug 2014 19:04:21 +0000 (21:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 26 Aug 2014 19:12:47 +0000 (21:12 +0200)
If we invoke agents, we should make sure we actually can kill them
again. I mean, it's probably not our job to cleanup the signals if our
tools are invoked in weird contexts, but at least we should make sure,
that the subprocesses we invoke and intend to control work as intended.

Also see:

http://lists.freedesktop.org/archives/systemd-devel/2014-August/022460.html

src/shared/util.c
src/shared/util.h

index 4af2d3cebad19a261a3134a162b20f6520f419ae..98c07163da28e8e871ef976392300c67f8d94bbe 100644 (file)
@@ -959,6 +959,18 @@ int reset_all_signal_handlers(void) {
         return r;
 }
 
         return r;
 }
 
+int reset_signal_mask(void) {
+        sigset_t ss;
+
+        if (sigemptyset(&ss) < 0)
+                return -errno;
+
+        if (sigprocmask(SIG_SETMASK, &ss, NULL) < 0)
+                return -errno;
+
+        return 0;
+}
+
 char *strstrip(char *s) {
         char *e;
 
 char *strstrip(char *s) {
         char *e;
 
@@ -5131,6 +5143,12 @@ int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *pa
         /* Don't leak fds to the agent */
         close_all_fds(except, n_except);
 
         /* Don't leak fds to the agent */
         close_all_fds(except, n_except);
 
+        /* Make sure we actually can kill the agent, if we need to, in
+         * case somebody invoked us from a shell script that trapped
+         * SIGTERM or so... */
+        reset_all_signal_handlers();
+        reset_signal_mask();
+
         stdout_is_tty = isatty(STDOUT_FILENO);
         stderr_is_tty = isatty(STDERR_FILENO);
 
         stdout_is_tty = isatty(STDOUT_FILENO);
         stderr_is_tty = isatty(STDERR_FILENO);
 
index cd947dbbef155317c98c243df88feeef0d702f55..ea87c9695604b611a070c2d17cc50f012185b6e4 100644 (file)
@@ -274,6 +274,7 @@ int readlink_and_make_absolute(const char *p, char **r);
 int readlink_and_canonicalize(const char *p, char **r);
 
 int reset_all_signal_handlers(void);
 int readlink_and_canonicalize(const char *p, char **r);
 
 int reset_all_signal_handlers(void);
+int reset_signal_mask(void);
 
 char *strstrip(char *s);
 char *delete_chars(char *s, const char *bad);
 
 char *strstrip(char *s);
 char *delete_chars(char *s, const char *bad);