[lxc-devel] [PATCH] lxc_init.c: error handing for sigaction and sigprocmask
Qiang Huang
h.huangqiang at huawei.com
Thu Jan 16 07:30:01 UTC 2014
Look through all LXC code and seems like only here are missed.
Signed-off-by: Qiang Huang <h.huangqiang at huawei.com>
---
Maybe this bug can be marked resolved:
https://github.com/lxc/lxc/issues/83
---
src/lxc/lxc_init.c | 46 +++++++++++++++++++++++++++++++---------------
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/src/lxc/lxc_init.c b/src/lxc/lxc_init.c
index d88a935..a59dd9c 100644
--- a/src/lxc/lxc_init.c
+++ b/src/lxc/lxc_init.c
@@ -123,11 +123,14 @@ int main(int argc, char *argv[])
* mask all the signals so we are safe to install a
* signal handler and to fork
*/
- sigfillset(&mask);
- sigdelset(&mask, SIGILL);
- sigdelset(&mask, SIGSEGV);
- sigdelset(&mask, SIGBUS);
- sigprocmask(SIG_SETMASK, &mask, &omask);
+ if (sigfillset(&mask) ||
+ sigdelset(&mask, SIGILL) ||
+ sigdelset(&mask, SIGSEGV) ||
+ sigdelset(&mask, SIGBUS) ||
+ sigprocmask(SIG_SETMASK, &mask, &omask)) {
+ SYSERROR("failed to set signal mask");
+ exit(EXIT_FAILURE);
+ }
for (i = 1; i < NSIG; i++) {
struct sigaction act;
@@ -143,15 +146,22 @@ int main(int argc, char *argv[])
i == SIGKILL)
continue;
- sigfillset(&act.sa_mask);
- sigdelset(&act.sa_mask, SIGILL);
- sigdelset(&act.sa_mask, SIGSEGV);
- sigdelset(&act.sa_mask, SIGBUS);
- sigdelset(&act.sa_mask, SIGSTOP);
- sigdelset(&act.sa_mask, SIGKILL);
+ if (sigfillset(&act.sa_mask) ||
+ sigdelset(&act.sa_mask, SIGILL) ||
+ sigdelset(&act.sa_mask, SIGSEGV) ||
+ sigdelset(&act.sa_mask, SIGBUS) ||
+ sigdelset(&act.sa_mask, SIGSTOP) ||
+ sigdelset(&act.sa_mask, SIGKILL)) {
+ ERROR("failed to set signal");
+ exit(EXIT_FAILURE);
+ }
+
act.sa_flags = 0;
act.sa_handler = interrupt_handler;
- sigaction(i, &act, NULL);
+ if (sigaction(i, &act, NULL)) {
+ SYSERROR("failed to sigaction");
+ exit(EXIT_FAILURE);
+ }
}
lxc_setup_fs();
@@ -170,7 +180,10 @@ int main(int argc, char *argv[])
for (i = 1; i < NSIG; i++)
signal(i, SIG_DFL);
- sigprocmask(SIG_SETMASK, &omask, NULL);
+ if (sigprocmask(SIG_SETMASK, &omask, NULL)) {
+ SYSERROR("failed to set signal mask");
+ exit(EXIT_FAILURE);
+ }
NOTICE("about to exec '%s'", aargv[0]);
@@ -180,8 +193,11 @@ int main(int argc, char *argv[])
}
/* let's process the signals now */
- sigdelset(&omask, SIGALRM);
- sigprocmask(SIG_SETMASK, &omask, NULL);
+ if (sigdelset(&omask, SIGALRM) ||
+ sigprocmask(SIG_SETMASK, &omask, NULL)) {
+ SYSERROR("failed to set signal mask");
+ exit(EXIT_FAILURE);
+ }
/* no need of other inherited fds but stderr */
close(fileno(stdin));
--
1.8.3
More information about the lxc-devel
mailing list