Skip to content

Commit

Permalink
fix signal sending in lxc.init
Browse files Browse the repository at this point in the history
The problem here is that these two clauses were ordered backwards: we first
check if the signal came from not the init pid, and if it did, then we give
a notice and return. The comment notes that this is intended to protect
against SIGCHLD, but we don't in fact know if the signal is a SIGCHLD yet,
because that's tested in the next hunk.

The symptom is that if I e.g. send SIGTERM from the outside world to the
container init, it ignores it and gives this notice. If we re-order these
clauses, it forwards non SIGCHLD signals, and ignores SIGCHLD signals from
things that aren't the real container process.

Signed-off-by: Tycho Andersen <[email protected]>
  • Loading branch information
tych0 committed Apr 4, 2018
1 parent 22b2b9c commit 9cb9438
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/lxc/start.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,12 @@ static int signal_handler(int fd, uint32_t events, void *data,
return hdlr->init_died ? LXC_MAINLOOP_CLOSE : 0;
}

if (siginfo.ssi_signo != SIGCHLD) {
kill(hdlr->pid, siginfo.ssi_signo);
INFO("Forwarded signal %d to pid %d", siginfo.ssi_signo, hdlr->pid);
return hdlr->init_died ? LXC_MAINLOOP_CLOSE : 0;
}

/* More robustness, protect ourself from a SIGCHLD sent
* by a process different from the container init.
*/
Expand All @@ -389,12 +395,6 @@ static int signal_handler(int fd, uint32_t events, void *data,
return hdlr->init_died ? LXC_MAINLOOP_CLOSE : 0;
}

if (siginfo.ssi_signo != SIGCHLD) {
kill(hdlr->pid, siginfo.ssi_signo);
INFO("Forwarded signal %d to pid %d", siginfo.ssi_signo, hdlr->pid);
return hdlr->init_died ? LXC_MAINLOOP_CLOSE : 0;
}

if (siginfo.ssi_code == CLD_STOPPED) {
INFO("Container init process was stopped");
return hdlr->init_died ? LXC_MAINLOOP_CLOSE : 0;
Expand Down

0 comments on commit 9cb9438

Please sign in to comment.