]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxccontainer: fix fd leaks when sending signals
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 24 May 2018 22:00:50 +0000 (00:00 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 24 May 2018 22:00:50 +0000 (00:00 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/lxccontainer.c

index d50ac8516b5aa50882245bc9ca88508ac9edd41e..2a806676708acd92bc0dfb0bcd0c588b2704f29c 100644 (file)
@@ -1893,24 +1893,30 @@ static bool lxcapi_create(struct lxc_container *c, const char *t,
 
 static bool do_lxcapi_reboot(struct lxc_container *c)
 {
+       int ret;
        pid_t pid;
        int rebootsignal = SIGINT;
 
        if (!c)
                return false;
+
        if (!do_lxcapi_is_running(c))
                return false;
+
        pid = do_lxcapi_init_pid(c);
        if (pid <= 0)
                return false;
+
        if (c->lxc_conf && c->lxc_conf->rebootsignal)
                rebootsignal = c->lxc_conf->rebootsignal;
-       if (kill(pid, rebootsignal) < 0) {
-               WARN("Could not send signal %d to pid %d.", rebootsignal, pid);
+
+       ret = kill(pid, rebootsignal);
+       if (ret < 0) {
+               WARN("Failed to send signal %d to pid %d", rebootsignal, pid);
                return false;
        }
-       return true;
 
+       return true;
 }
 
 WRAP_API(bool, lxcapi_reboot)
@@ -1958,15 +1964,18 @@ static bool do_lxcapi_reboot2(struct lxc_container *c, int timeout)
        /* Send reboot signal to container. */
        killret = kill(pid, rebootsignal);
        if (killret < 0) {
-               WARN("Could not send signal %d to pid %d", rebootsignal, pid);
                if (state_client_fd >= 0)
                        close(state_client_fd);
+               WARN("Failed to send signal %d to pid %d", rebootsignal, pid);
                return false;
        }
        TRACE("Sent signal %d to pid %d", rebootsignal, pid);
 
-       if (timeout == 0)
+       if (timeout == 0) {
+               if (state_client_fd >= 0)
+                       close(state_client_fd);
                return true;
+       }
 
        ret = lxc_cmd_sock_rcv_state(state_client_fd, timeout);
        close(state_client_fd);
@@ -1986,7 +1995,7 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
 {
        int killret, ret;
        pid_t pid;
-       int haltsignal = SIGPWR, state_client_fd = -1;
+       int haltsignal = SIGPWR, state_client_fd = -EBADF;
        lxc_state_t states[MAX_STATE] = {0};
 
        if (!c)
@@ -2028,15 +2037,18 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
        /* Send shutdown signal to container. */
        killret = kill(pid, haltsignal);
        if (killret < 0) {
-               WARN("Could not send signal %d to pid %d", haltsignal, pid);
                if (state_client_fd >= 0)
                        close(state_client_fd);
+               WARN("Failed to send signal %d to pid %d", haltsignal, pid);
                return false;
        }
        TRACE("Sent signal %d to pid %d", haltsignal, pid);
 
-       if (timeout == 0)
+       if (timeout == 0) {
+               if (state_client_fd >= 0)
+                       close(state_client_fd);
                return true;
+       }
 
        ret = lxc_cmd_sock_rcv_state(state_client_fd, timeout);
        close(state_client_fd);