utils: fix lxc_set_death_signal()

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2018-10-02 20:59:34 +02:00
parent 54b38b25b1
commit c7f493aee0
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D
3 changed files with 7 additions and 10 deletions

View File

@ -1068,7 +1068,7 @@ static int do_start(void *data)
* exit before we set the pdeath signal leading to a unsupervized * exit before we set the pdeath signal leading to a unsupervized
* container. * container.
*/ */
ret = lxc_set_death_signal(SIGKILL); ret = lxc_set_death_signal(SIGKILL, 0);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL"); SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL");
goto out_warn_father; goto out_warn_father;
@ -1146,7 +1146,7 @@ static int do_start(void *data)
goto out_warn_father; goto out_warn_father;
/* set{g,u}id() clears deathsignal */ /* set{g,u}id() clears deathsignal */
ret = lxc_set_death_signal(SIGKILL); ret = lxc_set_death_signal(SIGKILL, 0);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL"); SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL");
goto out_warn_father; goto out_warn_father;
@ -1388,7 +1388,7 @@ static int do_start(void *data)
} }
if (handler->conf->monitor_signal_pdeath != SIGKILL) { if (handler->conf->monitor_signal_pdeath != SIGKILL) {
ret = lxc_set_death_signal(handler->conf->monitor_signal_pdeath); ret = lxc_set_death_signal(handler->conf->monitor_signal_pdeath, 0);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to set PR_SET_PDEATHSIG to %d", SYSERROR("Failed to set PR_SET_PDEATHSIG to %d",
handler->conf->monitor_signal_pdeath); handler->conf->monitor_signal_pdeath);

View File

@ -1652,7 +1652,7 @@ uint64_t lxc_find_next_power2(uint64_t n)
return n; return n;
} }
int lxc_set_death_signal(int signal) int lxc_set_death_signal(int signal, pid_t parent)
{ {
int ret; int ret;
pid_t ppid; pid_t ppid;
@ -1662,11 +1662,8 @@ int lxc_set_death_signal(int signal)
/* Check whether we have been orphaned. */ /* Check whether we have been orphaned. */
ppid = (pid_t)syscall(SYS_getppid); ppid = (pid_t)syscall(SYS_getppid);
if (ppid == 1) { if (ppid != parent) {
pid_t self; ret = raise(SIGKILL);
self = lxc_raw_getpid();
ret = kill(self, SIGKILL);
if (ret < 0) if (ret < 0)
return -1; return -1;
} }

View File

@ -434,7 +434,7 @@ static inline pid_t lxc_raw_gettid(void)
} }
/* Set a signal the child process will receive after the parent has died. */ /* Set a signal the child process will receive after the parent has died. */
extern int lxc_set_death_signal(int signal); extern int lxc_set_death_signal(int signal, pid_t parent);
extern int fd_cloexec(int fd, bool cloexec); extern int fd_cloexec(int fd, bool cloexec);
extern int recursive_destroy(char *dirname); extern int recursive_destroy(char *dirname);
extern int lxc_setup_keyring(void); extern int lxc_setup_keyring(void);