commands: tell mainloop to reap client fd on error

This is the proper way to handle errors. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent f8bdb6dc
...@@ -922,8 +922,8 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath, ...@@ -922,8 +922,8 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath,
state = PTR_TO_INT(cmd.rsp.data); state = PTR_TO_INT(cmd.rsp.data);
if (state < MAX_STATE) { if (state < MAX_STATE) {
TRACE("Container is already in requested state %s", TRACE("Container is already in requested state %s", lxc_state2str(state));
lxc_state2str(state)); close(cmd.rsp.ret);
return state; return state;
} }
...@@ -935,21 +935,35 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath, ...@@ -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, static int lxc_cmd_add_state_client_callback(int fd, struct lxc_cmd_req *req,
struct lxc_handler *handler) struct lxc_handler *handler)
{ {
int ret;
struct lxc_cmd_rsp rsp = {0}; struct lxc_cmd_rsp rsp = {0};
if (req->datalen < 0) if (req->datalen < 0)
return -1; goto reap_client_fd;
if (req->datalen > (sizeof(lxc_state_t) * MAX_STATE)) if (req->datalen > (sizeof(lxc_state_t) * MAX_STATE))
return -1; goto reap_client_fd;
if (!req->data) if (!req->data)
return -1; goto reap_client_fd;
rsp.ret = lxc_add_state_client(fd, handler, (lxc_state_t *)req->data); 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); 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, int lxc_cmd_console_log(const char *name, const char *lxcpath,
......
...@@ -220,6 +220,7 @@ int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler, ...@@ -220,6 +220,7 @@ int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler,
} else { } else {
process_unlock(); process_unlock();
free(newclient); free(newclient);
free(tmplist);
return state; return state;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment