]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
commands: tell mainloop to reap client fd on error
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 25 Nov 2017 16:51:01 +0000 (17:51 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 6 Dec 2017 15:01:23 +0000 (16:01 +0100)
This is the proper way to handle errors.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/commands.c
src/lxc/commands_utils.c

index d95530ec7ab5aae42a9e7b234c1188f1efb30aeb..0a19f5f3d6a9b71cd68c9edd161cfee320d37cd5 100644 (file)
@@ -922,8 +922,8 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath,
 
        state = PTR_TO_INT(cmd.rsp.data);
        if (state < MAX_STATE) {
-               TRACE("Container is already in requested state %s",
-                     lxc_state2str(state));
+               TRACE("Container is already in requested state %s", lxc_state2str(state));
+               close(cmd.rsp.ret);
                return state;
        }
 
@@ -935,21 +935,35 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath,
 static int lxc_cmd_add_state_client_callback(int fd, struct lxc_cmd_req *req,
                                             struct lxc_handler *handler)
 {
+       int ret;
        struct lxc_cmd_rsp rsp = {0};
 
        if (req->datalen < 0)
-               return -1;
+               goto reap_client_fd;
 
        if (req->datalen > (sizeof(lxc_state_t) * MAX_STATE))
-               return -1;
+               goto reap_client_fd;
 
        if (!req->data)
-               return -1;
+               goto reap_client_fd;
 
        rsp.ret = lxc_add_state_client(fd, handler, (lxc_state_t *)req->data);
+       if (rsp.ret < 0)
+               goto reap_client_fd;
+
        rsp.data = INT_TO_PTR(rsp.ret);
 
-       return lxc_cmd_rsp_send(fd, &rsp);
+       ret = lxc_cmd_rsp_send(fd, &rsp);
+       if (ret < 0)
+               goto reap_client_fd;
+
+       return 0;
+
+reap_client_fd:
+       /* Special indicator to lxc_cmd_handler() to close the fd and do related
+        * cleanup.
+        */
+       return 1;
 }
 
 int lxc_cmd_console_log(const char *name, const char *lxcpath,
index 32831e2b61644669231f568fa051c849653026f8..12b13170789bbf2bdf5e6e9b3dcce5176793e199 100644 (file)
@@ -220,6 +220,7 @@ int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler,
        } else {
                process_unlock();
                free(newclient);
+               free(tmplist);
                return state;
        }