The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3287
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From a783a4140c263caa41fb67d23efac17d9dc6bee7 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Wed, 11 Mar 2020 01:56:44 +0100 Subject: [PATCH 1/2] start: cleanup file descriptor closing Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/start.c | 67 ++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/src/lxc/start.c b/src/lxc/start.c index dad4ff9843..b8edcdf369 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -471,8 +471,7 @@ static int lxc_serve_state_socket_pair(const char *name, return 0; /* Close read end of the socket pair. */ - close(handler->state_socket_pair[0]); - handler->state_socket_pair[0] = -1; + close_prot_errno_disarm(handler->state_socket_pair[0]); again: ret = lxc_abstract_unix_send_credential(handler->state_socket_pair[1], @@ -582,8 +581,7 @@ int lxc_poll(const char *name, struct lxc_handler *handler) TRACE("Mainloop is ready"); ret = lxc_mainloop(&descr, -1); - close(descr.epfd); - descr.epfd = -EBADF; + close_prot_errno_disarm(descr.epfd); if (ret < 0 || !handler->init_died) goto out_mainloop_console; @@ -601,9 +599,8 @@ int lxc_poll(const char *name, struct lxc_handler *handler) TRACE("Closed mainloop"); out_sigfd: - close(handler->sigfd); TRACE("Closed signal file descriptor %d", handler->sigfd); - handler->sigfd = -EBADF; + close_prot_errno_disarm(handler->sigfd); return ret; } @@ -612,6 +609,8 @@ void lxc_zero_handler(struct lxc_handler *handler) { memset(handler, 0, sizeof(struct lxc_handler)); + handler->state = STOPPED; + handler->pinfd = -EBADF; handler->pidfd = -EBADF; @@ -633,33 +632,16 @@ void lxc_zero_handler(struct lxc_handler *handler) void lxc_free_handler(struct lxc_handler *handler) { - if (handler->pinfd >= 0) - close_prot_errno_disarm(handler->pinfd); - - if (handler->pidfd >= 0) - close_prot_errno_disarm(handler->pidfd); - - if (handler->sigfd >= 0) - close_prot_errno_disarm(handler->sigfd); - + close_prot_errno_disarm(handler->pinfd); + close_prot_errno_disarm(handler->pidfd); + close_prot_errno_disarm(handler->sigfd); lxc_put_nsfds(handler); - if (handler->conf && handler->conf->reboot == REBOOT_NONE) - if (handler->conf->maincmd_fd >= 0) - close_prot_errno_disarm(handler->conf->maincmd_fd); - - if (handler->monitor_status_fd >= 0) - close_prot_errno_disarm(handler->monitor_status_fd); - - if (handler->state_socket_pair[0] >= 0) - close_prot_errno_disarm(handler->state_socket_pair[0]); - - if (handler->state_socket_pair[1] >= 0) - close_prot_errno_disarm(handler->state_socket_pair[1]); - - if (handler->cgroup_ops) - cgroup_exit(handler->cgroup_ops); - + close_prot_errno_disarm(handler->conf->maincmd_fd); + close_prot_errno_disarm(handler->monitor_status_fd); + close_prot_errno_disarm(handler->state_socket_pair[0]); + close_prot_errno_disarm(handler->state_socket_pair[1]); + cgroup_exit(handler->cgroup_ops); handler->conf = NULL; free_disarm(handler); } @@ -1114,8 +1096,7 @@ static int do_start(void *data) } /* Don't leak the pinfd to the container. */ - if (handler->pinfd >= 0) - close(handler->pinfd); + close_prot_errno_disarm(handler->pinfd); ret = lxc_sync_wait_parent(handler, LXC_SYNC_STARTUP); if (ret < 0) @@ -1324,7 +1305,7 @@ static int do_start(void *data) goto out_warn_father; } - close(handler->sigfd); + close_prot_errno_disarm(handler->sigfd); if (handler->conf->console.slave < 0 && handler->daemonize) { if (devnull_fd < 0) { @@ -1340,10 +1321,7 @@ static int do_start(void *data) } } - if (devnull_fd >= 0) { - close(devnull_fd); - devnull_fd = -1; - } + close_prot_errno_disarm(devnull_fd); setsid(); @@ -1446,8 +1424,7 @@ static int do_start(void *data) lxc_sync_wake_parent(handler, LXC_SYNC_ERROR); out_error: - if (devnull_fd >= 0) - close(devnull_fd); + close_prot_errno_disarm(devnull_fd); return -1; } @@ -1910,10 +1887,7 @@ static int lxc_spawn(struct lxc_handler *handler) out_sync_fini: lxc_sync_fini(handler); - if (handler->pinfd >= 0) { - close(handler->pinfd); - handler->pinfd = -1; - } + close_prot_errno_disarm(handler->pinfd); return -1; } @@ -2030,10 +2004,7 @@ int __lxc_start(const char *name, struct lxc_handler *handler, if (ret < 0) ERROR("Failed to move physical network devices back to parent network namespace"); - if (handler->pinfd >= 0) { - close(handler->pinfd); - handler->pinfd = -1; - } + close_prot_errno_disarm(handler->pinfd); lxc_monitor_send_exit_code(name, status, handler->lxcpath); lxc_error_set_and_log(handler->pid, status); From 0fb40573e59579e049cb11c5dbb0b726d824af0c Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Wed, 11 Mar 2020 02:35:51 +0100 Subject: [PATCH 2/2] af_unix: fix return value Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/af_unix.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index e70e0c9e22..04aef44ade 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -191,9 +191,8 @@ static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds, do { ret = recvmsg(fd, &msg, 0); } while (ret < 0 && errno == EINTR); - if (!ret) - return 0; - + if (ret < 0 || ret == 0) + return ret; /* * If SO_PASSCRED is set we will always get a ucred message.
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel