From 5c4fa9bdc202c7f474cb50f77a79acbea2abd009 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Mon, 15 Jul 2013 15:28:46 +0200 Subject: [PATCH] priv: use `sigaction()` instead of `signal()` to install non-default signals `signal()` is not portable to install non-default signals. --- src/daemon/priv.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/daemon/priv.c b/src/daemon/priv.c index 6b65e911..c5e630ae 100644 --- a/src/daemon/priv.c +++ b/src/daemon/priv.c @@ -492,12 +492,22 @@ priv_init(const char *chrootdir, int ctl, uid_t uid, gid_t gid) if (atexit(priv_exit) != 0) fatal("privsep", "unable to set exit function"); - signal(SIGALRM, sig_pass_to_chld); - signal(SIGTERM, sig_pass_to_chld); - signal(SIGHUP, sig_pass_to_chld); - signal(SIGINT, sig_pass_to_chld); - signal(SIGQUIT, sig_pass_to_chld); - signal(SIGCHLD, sig_chld); + /* Install signal handlers */ + const struct sigaction pass_to_child = { + .sa_handler = sig_pass_to_chld, + .sa_flags = SA_RESTART + }; + sigaction(SIGALRM, &pass_to_child, NULL); + sigaction(SIGTERM, &pass_to_child, NULL); + sigaction(SIGHUP, &pass_to_child, NULL); + sigaction(SIGINT, &pass_to_child, NULL); + sigaction(SIGQUIT, &pass_to_child, NULL); + const struct sigaction child = { + .sa_handler = sig_chld, + .sa_flags = SA_RESTART + }; + sigaction(SIGCHLD, &child, NULL); + if (waitpid(monitored, &status, WNOHANG) != 0) /* Child is already dead */ _exit(1); -- 2.39.5