]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
utils: fix lxc_set_death_signal() 2669/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 2 Oct 2018 18:59:34 +0000 (20:59 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 2 Oct 2018 19:00:59 +0000 (21:00 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/start.c
src/lxc/utils.c
src/lxc/utils.h

index 4f805525b612b453bfdfdd2e93e8abb2807b64b8..5899ea07bfbf68750adbf128551ad8addc5f7195 100644 (file)
@@ -1068,7 +1068,7 @@ static int do_start(void *data)
         * exit before we set the pdeath signal leading to a unsupervized
         * container.
         */
-       ret = lxc_set_death_signal(SIGKILL);
+       ret = lxc_set_death_signal(SIGKILL, 0);
        if (ret < 0) {
                SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL");
                goto out_warn_father;
@@ -1146,7 +1146,7 @@ static int do_start(void *data)
                        goto out_warn_father;
 
                /* set{g,u}id() clears deathsignal */
-               ret = lxc_set_death_signal(SIGKILL);
+               ret = lxc_set_death_signal(SIGKILL, 0);
                if (ret < 0) {
                        SYSERROR("Failed to set PR_SET_PDEATHSIG to SIGKILL");
                        goto out_warn_father;
@@ -1388,7 +1388,7 @@ static int do_start(void *data)
        }
 
        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) {
                        SYSERROR("Failed to set PR_SET_PDEATHSIG to %d",
                                 handler->conf->monitor_signal_pdeath);
index af0190fa3757017d73b685a9be19a7a569f08af1..1af6f512c7cc841b67b201cdc27b289d35ffbb83 100644 (file)
@@ -1652,7 +1652,7 @@ uint64_t lxc_find_next_power2(uint64_t n)
        return n;
 }
 
-int lxc_set_death_signal(int signal)
+int lxc_set_death_signal(int signal, pid_t parent)
 {
        int ret;
        pid_t ppid;
@@ -1662,11 +1662,8 @@ int lxc_set_death_signal(int signal)
 
        /* Check whether we have been orphaned. */
        ppid = (pid_t)syscall(SYS_getppid);
-       if (ppid == 1) {
-               pid_t self;
-
-               self = lxc_raw_getpid();
-               ret = kill(self, SIGKILL);
+       if (ppid != parent) {
+               ret = raise(SIGKILL);
                if (ret < 0)
                        return -1;
        }
index 6e53f71a1e37a6de97b6bb473899129124113206..7bb361cfbeaec9f07b35fc3969b14b3164f4a40c 100644 (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. */
-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 recursive_destroy(char *dirname);
 extern int lxc_setup_keyring(void);