From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 5B4A3139694 for ; Thu, 13 Apr 2017 17:56:13 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 29BAAE0C37; Thu, 13 Apr 2017 17:56:10 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 07B1EE0C37 for ; Thu, 13 Apr 2017 17:56:09 +0000 (UTC) Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 784C1340988 for ; Thu, 13 Apr 2017 17:56:08 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id E70EC7410 for ; Thu, 13 Apr 2017 17:56:06 +0000 (UTC) From: "William Hubbs" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "William Hubbs" Message-ID: <1492106070.4694900190a9078397bb9083328b68b489af92f4.williamh@OpenRC> Subject: [gentoo-commits] proj/openrc:master commit in: src/rc/ X-VCS-Repository: proj/openrc X-VCS-Files: src/rc/openrc-init.c X-VCS-Directories: src/rc/ X-VCS-Committer: williamh X-VCS-Committer-Name: William Hubbs X-VCS-Revision: 4694900190a9078397bb9083328b68b489af92f4 X-VCS-Branch: master Date: Thu, 13 Apr 2017 17:56:06 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 51aab114-99ff-4980-a403-f24e2bcf5240 X-Archives-Hash: 617157981ccd4f2394e821487e16b802 commit: 4694900190a9078397bb9083328b68b489af92f4 Author: William Hubbs gmail com> AuthorDate: Thu Apr 13 17:54:18 2017 +0000 Commit: William Hubbs gentoo org> CommitDate: Thu Apr 13 17:54:30 2017 +0000 URL: https://gitweb.gentoo.org/proj/openrc.git/commit/?id=46949001 init: fix signal handling The only signals we handle are SIGINT and SIGCHLD, so block all others and unblock them in the child process before we start a rurnlevel. src/rc/openrc-init.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/rc/openrc-init.c b/src/rc/openrc-init.c index 61052806..621c81ea 100644 --- a/src/rc/openrc-init.c +++ b/src/rc/openrc-init.c @@ -39,6 +39,7 @@ static const char *rc_default_runlevel = "default"; static pid_t do_openrc(const char *runlevel) { pid_t pid; + sigset_t signals; pid = fork(); switch(pid) { @@ -47,6 +48,9 @@ static pid_t do_openrc(const char *runlevel) break; case 0: setsid(); + /* unblock all signals */ + sigemptyset(&signals); + sigprocmask(SIG_SETMASK, &signals, NULL); printf("Starting %s runlevel\n", runlevel); execl("/sbin/openrc", "/sbin/openrc", runlevel, NULL); perror("exec"); @@ -135,11 +139,14 @@ int main(int argc, char **argv) int count; FILE *fifo; bool reexec = false; + sigset_t signals; struct sigaction sa; if (getpid() != 1) return 1; + printf("OpenRC init version %s starting\n", VERSION); + if (argc > 1) default_runlevel = argv[1]; else @@ -148,15 +155,22 @@ int main(int argc, char **argv) if (default_runlevel && strcmp(default_runlevel, "reexec") == 0) reexec = true; - printf("OpenRC init version %s starting\n", VERSION); - if (! reexec) - init(default_runlevel); + /* block all signals we do not handle */ + sigfillset(&signals); + sigdelset(&signals, SIGCHLD); + sigdelset(&signals, SIGINT); + sigprocmask(SIG_SETMASK, &signals, NULL); + + /* install signal handler */ memset(&sa, 0, sizeof(sa)); sa.sa_handler = signal_handler; sigaction(SIGCHLD, &sa, NULL); sigaction(SIGINT, &sa, NULL); reboot(RB_DISABLE_CAD); + if (! reexec) + init(default_runlevel); + if (mkfifo(RC_INIT_FIFO, 0600) == -1 && errno != EEXIST) perror("mkfifo");