Unverified Commit 823486c1 by Stéphane Graber Committed by GitHub

Merge pull request #3287 from brauner/2020-03-11/fixes

fixes
parents 85e9c763 807d526d
...@@ -191,9 +191,8 @@ static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds, ...@@ -191,9 +191,8 @@ static int lxc_abstract_unix_recv_fds_iov(int fd, int *recvfds, int num_recvfds,
do { do {
ret = recvmsg(fd, &msg, 0); ret = recvmsg(fd, &msg, 0);
} while (ret < 0 && errno == EINTR); } while (ret < 0 && errno == EINTR);
if (!ret) if (ret < 0 || ret == 0)
return 0; return ret;
/* /*
* If SO_PASSCRED is set we will always get a ucred message. * If SO_PASSCRED is set we will always get a ucred message.
......
...@@ -114,22 +114,25 @@ int lxc_make_abstract_socket_name(char *path, size_t pathlen, ...@@ -114,22 +114,25 @@ int lxc_make_abstract_socket_name(char *path, size_t pathlen,
} }
ret = snprintf(offset, len, "%s/%s/%s", lxcpath, name, suffix); ret = snprintf(offset, len, "%s/%s/%s", lxcpath, name, suffix);
if (ret < 0 || (size_t)ret >= len) if (ret < 0)
return log_error_errno(-1, errno, "Failed to create abstract socket name"); return log_error_errno(-1, errno, "Failed to create abstract socket name");
if (ret < len)
return 0;
/* ret >= len; lxcpath or name is too long. hash both */ /*
tmplen = strlen(name) + strlen(lxcpath) + 2; * ret >= len. This means lxcpath and name are too long. We need to
tmppath = must_realloc(NULL, tmplen); * hash both.
ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name); */
if (ret < 0 || (size_t)ret >= tmplen) if (ret >= len) {
return log_error_errno(-1, errno, "Failed to create abstract socket name"); tmplen = strlen(name) + strlen(lxcpath) + 2;
tmppath = must_realloc(NULL, tmplen);
ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name);
if (ret < 0 || (size_t)ret >= tmplen)
return log_error_errno(-1, errno, "Failed to create abstract socket name");
hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT); hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT);
ret = snprintf(offset, len, "lxc/%016" PRIx64 "/%s", hash, suffix); ret = snprintf(offset, len, "lxc/%016" PRIx64 "/%s", hash, suffix);
if (ret < 0 || ret >= len) if (ret < 0 || (size_t)ret >= len)
return log_error_errno(-1, errno, "Failed to create abstract socket name"); return log_error_errno(-1, errno, "Failed to create abstract socket name");
}
return 0; return 0;
} }
......
...@@ -471,8 +471,7 @@ static int lxc_serve_state_socket_pair(const char *name, ...@@ -471,8 +471,7 @@ static int lxc_serve_state_socket_pair(const char *name,
return 0; return 0;
/* Close read end of the socket pair. */ /* Close read end of the socket pair. */
close(handler->state_socket_pair[0]); close_prot_errno_disarm(handler->state_socket_pair[0]);
handler->state_socket_pair[0] = -1;
again: again:
ret = lxc_abstract_unix_send_credential(handler->state_socket_pair[1], 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) ...@@ -582,8 +581,7 @@ int lxc_poll(const char *name, struct lxc_handler *handler)
TRACE("Mainloop is ready"); TRACE("Mainloop is ready");
ret = lxc_mainloop(&descr, -1); ret = lxc_mainloop(&descr, -1);
close(descr.epfd); close_prot_errno_disarm(descr.epfd);
descr.epfd = -EBADF;
if (ret < 0 || !handler->init_died) if (ret < 0 || !handler->init_died)
goto out_mainloop_console; goto out_mainloop_console;
...@@ -601,9 +599,8 @@ out_mainloop: ...@@ -601,9 +599,8 @@ out_mainloop:
TRACE("Closed mainloop"); TRACE("Closed mainloop");
out_sigfd: out_sigfd:
close(handler->sigfd);
TRACE("Closed signal file descriptor %d", handler->sigfd); TRACE("Closed signal file descriptor %d", handler->sigfd);
handler->sigfd = -EBADF; close_prot_errno_disarm(handler->sigfd);
return ret; return ret;
} }
...@@ -612,6 +609,8 @@ void lxc_zero_handler(struct lxc_handler *handler) ...@@ -612,6 +609,8 @@ void lxc_zero_handler(struct lxc_handler *handler)
{ {
memset(handler, 0, sizeof(struct lxc_handler)); memset(handler, 0, sizeof(struct lxc_handler));
handler->state = STOPPED;
handler->pinfd = -EBADF; handler->pinfd = -EBADF;
handler->pidfd = -EBADF; handler->pidfd = -EBADF;
...@@ -633,33 +632,16 @@ void lxc_zero_handler(struct lxc_handler *handler) ...@@ -633,33 +632,16 @@ void lxc_zero_handler(struct lxc_handler *handler)
void lxc_free_handler(struct lxc_handler *handler) void lxc_free_handler(struct lxc_handler *handler)
{ {
if (handler->pinfd >= 0) close_prot_errno_disarm(handler->pinfd);
close_prot_errno_disarm(handler->pinfd); close_prot_errno_disarm(handler->pidfd);
close_prot_errno_disarm(handler->sigfd);
if (handler->pidfd >= 0)
close_prot_errno_disarm(handler->pidfd);
if (handler->sigfd >= 0)
close_prot_errno_disarm(handler->sigfd);
lxc_put_nsfds(handler); lxc_put_nsfds(handler);
if (handler->conf && handler->conf->reboot == REBOOT_NONE) if (handler->conf && handler->conf->reboot == REBOOT_NONE)
if (handler->conf->maincmd_fd >= 0) close_prot_errno_disarm(handler->conf->maincmd_fd);
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]);
if (handler->monitor_status_fd >= 0) close_prot_errno_disarm(handler->state_socket_pair[1]);
close_prot_errno_disarm(handler->monitor_status_fd); cgroup_exit(handler->cgroup_ops);
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);
handler->conf = NULL; handler->conf = NULL;
free_disarm(handler); free_disarm(handler);
} }
...@@ -1114,8 +1096,7 @@ static int do_start(void *data) ...@@ -1114,8 +1096,7 @@ static int do_start(void *data)
} }
/* Don't leak the pinfd to the container. */ /* Don't leak the pinfd to the container. */
if (handler->pinfd >= 0) close_prot_errno_disarm(handler->pinfd);
close(handler->pinfd);
ret = lxc_sync_wait_parent(handler, LXC_SYNC_STARTUP); ret = lxc_sync_wait_parent(handler, LXC_SYNC_STARTUP);
if (ret < 0) if (ret < 0)
...@@ -1324,7 +1305,7 @@ static int do_start(void *data) ...@@ -1324,7 +1305,7 @@ static int do_start(void *data)
goto out_warn_father; goto out_warn_father;
} }
close(handler->sigfd); close_prot_errno_disarm(handler->sigfd);
if (handler->conf->console.slave < 0 && handler->daemonize) { if (handler->conf->console.slave < 0 && handler->daemonize) {
if (devnull_fd < 0) { if (devnull_fd < 0) {
...@@ -1340,10 +1321,7 @@ static int do_start(void *data) ...@@ -1340,10 +1321,7 @@ static int do_start(void *data)
} }
} }
if (devnull_fd >= 0) { close_prot_errno_disarm(devnull_fd);
close(devnull_fd);
devnull_fd = -1;
}
setsid(); setsid();
...@@ -1446,8 +1424,7 @@ out_warn_father: ...@@ -1446,8 +1424,7 @@ out_warn_father:
lxc_sync_wake_parent(handler, LXC_SYNC_ERROR); lxc_sync_wake_parent(handler, LXC_SYNC_ERROR);
out_error: out_error:
if (devnull_fd >= 0) close_prot_errno_disarm(devnull_fd);
close(devnull_fd);
return -1; return -1;
} }
...@@ -1910,10 +1887,7 @@ out_abort: ...@@ -1910,10 +1887,7 @@ out_abort:
out_sync_fini: out_sync_fini:
lxc_sync_fini(handler); lxc_sync_fini(handler);
if (handler->pinfd >= 0) { close_prot_errno_disarm(handler->pinfd);
close(handler->pinfd);
handler->pinfd = -1;
}
return -1; return -1;
} }
...@@ -2030,10 +2004,7 @@ int __lxc_start(const char *name, struct lxc_handler *handler, ...@@ -2030,10 +2004,7 @@ int __lxc_start(const char *name, struct lxc_handler *handler,
if (ret < 0) if (ret < 0)
ERROR("Failed to move physical network devices back to parent network namespace"); ERROR("Failed to move physical network devices back to parent network namespace");
if (handler->pinfd >= 0) { close_prot_errno_disarm(handler->pinfd);
close(handler->pinfd);
handler->pinfd = -1;
}
lxc_monitor_send_exit_code(name, status, handler->lxcpath); lxc_monitor_send_exit_code(name, status, handler->lxcpath);
lxc_error_set_and_log(handler->pid, status); lxc_error_set_and_log(handler->pid, status);
......
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