]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: whenever we fork off a foreign child process reset signal mask/handlers
authorLennart Poettering <lennart@poettering.net>
Sun, 31 May 2015 21:55:55 +0000 (23:55 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 9 Jun 2015 23:28:58 +0000 (01:28 +0200)
Also, when the child is potentially long-running make sure to set a
death signal.

Also, ignore the result of the reset operations explicitly by casting
them to (void).

26 files changed:
src/activate/activate.c
src/core/busname.c
src/core/execute.c
src/core/main.c
src/core/socket.c
src/delta/delta.c
src/fsck/fsck.c
src/import/export.c
src/import/import-common.c
src/import/import.c
src/import/importd.c
src/import/pull-common.c
src/import/pull.c
src/journal-remote/journal-remote.c
src/journal/coredumpctl.c
src/libsystemd/sd-bus/bus-socket.c
src/login/inhibit.c
src/nspawn/nspawn.c
src/quotacheck/quotacheck.c
src/remount-fs/remount-fs.c
src/shared/machine-pool.c
src/shared/pager.c
src/shared/pty.c
src/shared/util.c
src/systemctl/systemctl.c
src/vconsole/vconsole-setup.c

index d345e285679f397c6814e89a30a70d3e49f69b19..5318829442a8647119c0549d245756ac945c7c29 100644 (file)
@@ -33,6 +33,7 @@
 #include "log.h"
 #include "strv.h"
 #include "macro.h"
+#include "signal-util.h"
 
 static char** arg_listen = NULL;
 static bool arg_accept = false;
@@ -192,6 +193,10 @@ static int launch1(const char* child, char** argv, char **env, int fd) {
 
         /* In the child */
         if (child_pid == 0) {
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 r = dup2(fd, STDIN_FILENO);
                 if (r < 0) {
                         log_error_errno(errno, "Failed to dup connection to stdin: %m");
index 3f5abbcb244551642b784b255b23b2c07cd94052..2085721546fa15c0770ac6475d59fefa22fb20c6 100644 (file)
@@ -408,8 +408,8 @@ static int busname_make_starter(BusName *n, pid_t *_pid) {
         if (pid == 0) {
                 int ret;
 
-                default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
-                ignore_signals(SIGPIPE, -1);
+                (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
+                (void) ignore_signals(SIGPIPE, -1);
                 log_forget_fds();
 
                 r = bus_kernel_make_starter(n->starter_fd, n->name, n->activating, n->accept_fd, n->policy, n->policy_world);
index 4120493bda81d0e4fd9b67c11ac9064e67ce5979..f13c6936e0e1060dfcab1caf0234b23534a764cd 100644 (file)
@@ -823,6 +823,7 @@ static int setup_pam(
 
         /* Block SIGTERM, so that we know that it won't get lost in
          * the child */
+
         if (sigemptyset(&ss) < 0 ||
             sigaddset(&ss, SIGTERM) < 0 ||
             sigprocmask(SIG_BLOCK, &ss, &old_ss) < 0)
@@ -857,6 +858,8 @@ static int setup_pam(
                 if (setresuid(uid, uid, uid) < 0)
                         log_error_errno(r, "Error: Failed to setresuid() in sd-pam: %m");
 
+                (void) ignore_signals(SIGPIPE, -1);
+
                 /* Wait until our parent died. This will only work if
                  * the above setresuid() succeeds, otherwise the kernel
                  * will not allow unprivileged parents kill their privileged
@@ -1324,11 +1327,11 @@ static int exec_child(
          * others we leave untouched because we set them to
          * SIG_DFL or a valid handler initially, both of which
          * will be demoted to SIG_DFL. */
-        default_signals(SIGNALS_CRASH_HANDLER,
-                        SIGNALS_IGNORE, -1);
+        (void) default_signals(SIGNALS_CRASH_HANDLER,
+                               SIGNALS_IGNORE, -1);
 
         if (context->ignore_sigpipe)
-                ignore_signals(SIGPIPE, -1);
+                (void) ignore_signals(SIGPIPE, -1);
 
         r = reset_signal_mask();
         if (r < 0) {
index 29ccff7b6357402cee012066853f056caf2b510d..332453a0ea01e2517aa808550204827eb74bdd1c 100644 (file)
@@ -1405,9 +1405,8 @@ int main(int argc, char *argv[]) {
         }
 
         /* Reset all signal handlers. */
-        assert_se(reset_all_signal_handlers() == 0);
-
-        ignore_signals(SIGNALS_IGNORE, -1);
+        (void) reset_all_signal_handlers();
+        (void) ignore_signals(SIGNALS_IGNORE, -1);
 
         if (parse_config_file() < 0) {
                 error_message = "Failed to parse config file";
@@ -1931,8 +1930,8 @@ finish:
 
                 /* Reenable any blocked signals, especially important
                  * if we switch from initial ramdisk to init=... */
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
 
                 if (switch_root_init) {
                         args[0] = switch_root_init;
index 02399620552fa2fb8125cc941ddb20aae78a14da..d3178e642bb2af85e2eaacb44aa36114154e7075 100644 (file)
@@ -1473,8 +1473,8 @@ static int socket_chown(Socket *s, pid_t *_pid) {
                 gid_t gid = GID_INVALID;
                 int ret;
 
-                default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
-                ignore_signals(SIGPIPE, -1);
+                (void) default_signals(SIGNALS_CRASH_HANDLER, SIGNALS_IGNORE, -1);
+                (void) ignore_signals(SIGPIPE, -1);
                 log_forget_fds();
 
                 if (!isempty(s->user)) {
index c764bb4b46141633d68c3296a42a3e11c9153aa6..b60aaef734f1473ae9476cb92cba933b0bf6888c 100644 (file)
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <getopt.h>
+#include <sys/prctl.h>
 
 #include "hashmap.h"
 #include "util.h"
@@ -34,6 +35,7 @@
 #include "strv.h"
 #include "process-util.h"
 #include "terminal-util.h"
+#include "signal-util.h"
 
 static const char prefixes[] =
         "/etc\0"
@@ -189,9 +191,14 @@ static int found_override(const char *top, const char *bottom) {
         if (pid < 0)
                 return log_error_errno(errno, "Failed to fork off diff: %m");
         else if (pid == 0) {
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+                assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
+
                 execlp("diff", "diff", "-us", "--", bottom, top, NULL);
                 log_error_errno(errno, "Failed to execute diff: %m");
-                _exit(1);
+                _exit(EXIT_FAILURE);
         }
 
         wait_for_terminate_and_warn("diff", pid, false);
index f0e5c5f239548a0e567043644625d8956452ec72..30254b6680c22e7f27257365e3bbadafc6f24e59 100644 (file)
@@ -394,8 +394,8 @@ int main(int argc, char *argv[]) {
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 /* Close the reading side of the progress pipe */
index d4bc88e010c16e822b2c3041a76a3a024593249f..e563bee96e6cbdf1082cc05cb143a7a6dec385f4 100644 (file)
@@ -311,7 +311,7 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
-        ignore_signals(SIGPIPE, -1);
+        (void) ignore_signals(SIGPIPE, -1);
 
         r = export_main(argc, argv);
 
index 971161400083ba8818cf6eaf982f96d4f5782794..950c7b4acd6b185f86206b208932685a69a64aa4 100644 (file)
@@ -97,8 +97,8 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 pipefd[1] = safe_close(pipefd[1]);
@@ -171,8 +171,8 @@ int import_fork_tar_c(const char *path, pid_t *ret) {
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 pipefd[0] = safe_close(pipefd[0]);
index fff5a104b1404f3cc65055aa858835dd7ae0a43d..3091ed1c454f5fe371f9af5ad22352e957cb5c41 100644 (file)
@@ -328,7 +328,7 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
-        ignore_signals(SIGPIPE, -1);
+        (void) ignore_signals(SIGPIPE, -1);
 
         r = import_main(argc, argv);
 
index 50566a6e5ca4c44e8715eda1634bb2f7d464ffef..e2df44ad26ed94677eb48dda7354ab423c28ad04 100644 (file)
@@ -390,8 +390,8 @@ static int transfer_start(Transfer *t) {
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 pipefd[0] = safe_close(pipefd[0]);
index d2588d4fa0a0ab796d85ff6deb3ae14881e11466..652277e4be621a9ed33f7af6680269b195229484 100644 (file)
@@ -339,8 +339,8 @@ int pull_verify(
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 gpg_pipe[1] = safe_close(gpg_pipe[1]);
index eec458386841e61bd8ff8ae811cede6cac91a308..03fe3dcaf497bc670e967fff80b45945f6813156 100644 (file)
@@ -440,7 +440,7 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
-        ignore_signals(SIGPIPE, -1);
+        (void) ignore_signals(SIGPIPE, -1);
 
         r = pull_main(argc, argv);
 
index 911e2a178bef0fc0b829d8d8774110c7d095e519..ae332d826fc29583262b45374bbdf1d003bdca1c 100644 (file)
@@ -96,6 +96,10 @@ static int spawn_child(const char* child, char** argv) {
 
         /* In the child */
         if (child_pid == 0) {
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 r = dup2(fd[1], STDOUT_FILENO);
                 if (r < 0) {
                         log_error_errno(errno, "Failed to dup pipe to stdout: %m");
index 381bf72776f7cbcb0049462a9b323108934e0a4a..fc49b2e1743ea707e95bc74342a83da8ef58a3b0 100644 (file)
@@ -757,6 +757,9 @@ static int run_gdb(sd_journal *j) {
                 goto finish;
         }
         if (pid == 0) {
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 execlp("gdb", "gdb", exe, path, NULL);
 
                 log_error_errno(errno, "Failed to invoke gdb: %m");
index 4fffc6581d5eedd586e22202c40ed3bd34eab810..93ebe80b07747c62d8da36bbc39a9e6dfd804c93 100644 (file)
@@ -738,7 +738,8 @@ int bus_socket_exec(sd_bus *b) {
         if (pid == 0) {
                 /* Child */
 
-                reset_all_signal_handlers();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
 
                 close_all_fds(s+1, 1);
 
index 57cfb5d0b50855b801bb37cf41715ab8666281d1..0e5dce59258c47ae797a668af8dcc3d57be5ee6d 100644 (file)
@@ -33,6 +33,7 @@
 #include "strv.h"
 #include "formats-util.h"
 #include "process-util.h"
+#include "signal-util.h"
 
 static const char* arg_what = "idle:sleep:shutdown";
 static const char* arg_who = NULL;
@@ -274,6 +275,9 @@ int main(int argc, char *argv[]) {
                 if (pid == 0) {
                         /* Child */
 
+                        (void) reset_all_signal_handlers();
+                        (void) reset_signal_mask();
+
                         close_all_fds(NULL, 0);
 
                         execvp(argv[optind], argv + optind);
index 4211a3d7798c5824bf9ca963a4efb0829632fcdc..251af4a67c5a55437fb61c4859bf037eddee3748 100644 (file)
@@ -3656,7 +3656,8 @@ static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
                 if (nullfd > 2)
                         safe_close(nullfd);
 
-                reset_all_signal_handlers();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 close_all_fds(NULL, 0);
 
                 execle("/usr/bin/getent", "getent", database, key, NULL, &empty_env);
@@ -4739,8 +4740,8 @@ int main(int argc, char *argv[]) {
                         rtnl_socket_pair[0] = safe_close(rtnl_socket_pair[0]);
                         pid_socket_pair[0] = safe_close(pid_socket_pair[0]);
 
-                        reset_all_signal_handlers();
-                        reset_signal_mask();
+                        (void) reset_all_signal_handlers();
+                        (void) reset_signal_mask();
 
                         r = outer_child(&barrier,
                                         arg_directory,
index a729f592cf3e95a10c93921842aa7c3e60d68ee3..cf6a2394029d3e7272967c645243c0a92aa35345 100644 (file)
 #include <stdbool.h>
 #include <errno.h>
 #include <unistd.h>
+#include <sys/prctl.h>
 
 #include "util.h"
 #include "process-util.h"
+#include "signal-util.h"
 
 static bool arg_skip = false;
 static bool arg_force = false;
@@ -105,7 +107,13 @@ int main(int argc, char *argv[]) {
                 log_error_errno(errno, "fork(): %m");
                 return EXIT_FAILURE;
         } else if (pid == 0) {
+
                 /* Child */
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+                assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
+
                 execv(cmdline[0], (char**) cmdline);
                 _exit(1); /* Operational error */
         }
index e701fc9faec1f2966e2ec7a2105eb0525e15f13a..f904e48e753d35c5a80c40ef16f5c2b8f03e444e 100644 (file)
@@ -95,6 +95,9 @@ int main(int argc, char *argv[]) {
                         const char *arguments[5];
                         /* Child */
 
+                        (void) reset_all_signal_handlers();
+                        (void) reset_signal_mask();
+
                         arguments[0] = MOUNT_PATH;
                         arguments[1] = me->mnt_dir;
                         arguments[2] = "-o";
index d27931cb4aaf726c593fbcd81a475225981f4b98..8c64908b1a327a137dbbc0bd700a761a82ee746a 100644 (file)
@@ -109,8 +109,8 @@ static int setup_machine_raw(uint64_t size, sd_bus_error *error) {
 
                 /* Child */
 
-                reset_all_signal_handlers();
-                reset_signal_mask();
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
                 assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
                 fd = safe_close(fd);
index 58b62fdccfab66cd430c5bb304ef4c7dbd3cc2fd..13f03e798b2b83ec030941d1918ac3ab02e25a38 100644 (file)
@@ -30,6 +30,7 @@
 #include "process-util.h"
 #include "macro.h"
 #include "terminal-util.h"
+#include "signal-util.h"
 
 static pid_t pager_pid = 0;
 
@@ -85,6 +86,9 @@ int pager_open(bool jump_to_end) {
         if (pager_pid == 0) {
                 const char* less_opts;
 
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 dup2(fd[0], STDIN_FILENO);
                 safe_close_pair(fd);
 
@@ -178,6 +182,10 @@ int show_man_page(const char *desc, bool null_stdio) {
 
         if (pid == 0) {
                 /* Child */
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 if (null_stdio) {
                         r = make_null_stdio();
                         if (r < 0) {
index 119d66e9a2274afcf45a3418a79203fef0186459..a87b3ce6f0ba4efa6ca09b3ef26cdd7834b25c12 100644 (file)
@@ -239,7 +239,7 @@ int pty_setup_child(Pty *pty) {
         assert_return(pty_is_child(pty), -EINVAL);
         assert_return(pty_is_open(pty), -EALREADY);
 
-        r = sigprocmask_many(SIG_SETMASK, -1);
+        r = reset_signal_mask();
         if (r < 0)
                 return r;
 
index dc5e938796305dd06b6251cbaa8f1728694367bf..a20e7bb2ef2499aaeacf55f92c96a8677b74beee 100644 (file)
@@ -2301,8 +2301,8 @@ static int do_execute(char **directories, usec_t timeout, char *argv[]) {
         /* We fork this all off from a child process so that we can
          * somewhat cleanly make use of SIGALRM to set a time limit */
 
-        reset_all_signal_handlers();
-        reset_signal_mask();
+        (void) reset_all_signal_handlers();
+        (void) reset_signal_mask();
 
         assert_se(prctl(PR_SET_PDEATHSIG, SIGTERM) == 0);
 
@@ -3344,8 +3344,8 @@ int fork_agent(pid_t *pid, const int except[], unsigned n_except, const char *pa
         /* 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();
+        (void) reset_all_signal_handlers();
+        (void) reset_signal_mask();
 
         /* Check whether our parent died before we were able
          * to set the death signal and unblock the signals */
index b3d90d2c3343e348dca65b607de188d4b8fcdc6e..5075e4e176c609c72ce29184244c9d20a03c209c 100644 (file)
@@ -5189,6 +5189,9 @@ static int enable_sysv_units(const char *verb, char **args) {
                 else if (pid == 0) {
                         /* Child */
 
+                        (void) reset_all_signal_handlers();
+                        (void) reset_signal_mask();
+
                         execv(argv[0], (char**) argv);
                         log_error("Failed to execute %s: %m", argv[0]);
                         _exit(EXIT_FAILURE);
@@ -5854,6 +5857,9 @@ static int run_editor(char **paths) {
                 unsigned i = 1;
                 size_t argc;
 
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 argc = strv_length(paths)/2 + 1;
                 args = newa(const char*, argc + 1);
 
index 6c782b31308de095c04eff27af3717078e12b060..f7728dcfff411fc1ec2b33bed22a2a9a0c12238c 100644 (file)
@@ -37,6 +37,7 @@
 #include "fileio.h"
 #include "process-util.h"
 #include "terminal-util.h"
+#include "signal-util.h"
 
 static bool is_vconsole(int fd) {
         unsigned char data[1];
@@ -122,6 +123,10 @@ static int keyboard_load_and_wait(const char *vc, const char *map, const char *m
         if (pid < 0)
                 return log_error_errno(errno, "Failed to fork: %m");
         else if (pid == 0) {
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 execv(args[0], (char **) args);
                 _exit(EXIT_FAILURE);
         }
@@ -160,6 +165,10 @@ static int font_load_and_wait(const char *vc, const char *font, const char *map,
         if (pid < 0)
                 return log_error_errno(errno, "Failed to fork: %m");
         else if (pid == 0) {
+
+                (void) reset_all_signal_handlers();
+                (void) reset_signal_mask();
+
                 execv(args[0], (char **) args);
                 _exit(EXIT_FAILURE);
         }