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

S.Çağlar Onur caglar at 10ur.org
Thu Jan 16 20:05:46 UTC 2014


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

>> ---
>> 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>


More information about the lxc-devel mailing list