[lxc-devel] [PATCH] lxc_init.c: error handing for sigaction and sigprocmask

Stéphane Graber stgraber at ubuntu.com
Thu Jan 16 20:16:32 UTC 2014


On Thu, Jan 16, 2014 at 03:05:46PM -0500, S.Çağlar Onur wrote:
> Hey,
> 
> On Thu, Jan 16, 2014 at 11:03 AM, Stéphane Graber <stgraber at ubuntu.com> wrote:
> > On Thu, Jan 16, 2014 at 03:30:01PM +0800, Qiang Huang wrote:
> >> Look through all LXC code and seems like only here are missed.
> >>
> >> Signed-off-by: Qiang Huang <h.huangqiang at huawei.com>
> >
> > Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> 
> Looks like lxc-execute stopped working after this patch
> 
> [caglar at qp:~/go/src/github.com/caglar10ur/lxc(devel)] sudo lxc-execute
> -n t -- ls
> lxc-init: Invalid argument - failed to sigaction
> 
> reverting the commit makes it functional again
> 
> [caglar at qp:~/go/src/github.com/caglar10ur/lxc(devel)] sudo lxc-execute
> -n t -- ls
> LICENSE  Makefile  README.md  const.go  container.go  examples  lxc.c
> lxc.go  lxc.h  lxc_test.go  type.go  util.go

Interesting, can we try to figure out what sig handler is failing, I
believe that'd be more interesting than doing a plain revert as the
intent of the previous commit still seems good.

> 
> >> ---
> >> 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
> >>
> >
> > --
> > Stéphane Graber
> > Ubuntu developer
> > http://www.ubuntu.com
> >
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> >
> 
> 
> 
> -- 
> S.Çağlar Onur <caglar at 10ur.org>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140116/2a7d9adc/attachment.pgp>


More information about the lxc-devel mailing list