From c33d269b8c7be5926b5f17f10f91aacf77f7b9b8 Mon Sep 17 00:00:00 2001 From: Joel Teichroeb Date: Sun, 9 Mar 2014 13:43:08 -0700 Subject: [PATCH] nspawn: Fix a race condition --- src/nspawn/nspawn.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 92b6728..a83d1f3 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -1776,7 +1776,7 @@ finish: int main(int argc, char *argv[]) { - _cleanup_close_ int master = -1, kdbus_fd = -1, sync_fd = -1; + _cleanup_close_ int master = -1, kdbus_fd = -1, sync_fd = -1, sync_fd2 = -1; _cleanup_close_pipe_ int kmsg_socket_pair[2] = { -1, -1 }; _cleanup_free_ char *kdbus_domain = NULL; _cleanup_fdset_free_ FDSet *fds = NULL; @@ -1925,9 +1925,11 @@ int main(int argc, char *argv[]) { for (;;) { siginfo_t status; + eventfd_t x; sync_fd = eventfd(0, EFD_CLOEXEC); - if (sync_fd < 0) { + sync_fd2 = eventfd(0, EFD_CLOEXEC); + if (sync_fd < 0 || sync_fd2 < 0) { log_error("Failed to create event fd: %m"); goto finish; } @@ -1964,7 +1966,6 @@ int main(int argc, char *argv[]) { NULL }; char **env_use; - eventfd_t x; envp[n_env] = strv_find_prefix(environ, "TERM="); if (envp[n_env]) @@ -2201,6 +2202,9 @@ int main(int argc, char *argv[]) { goto child_fail; } } + eventfd_write(sync_fd2, 1); + close_nointr_nofail(sync_fd2); + sync_fd2 = -1; eventfd_read(sync_fd, &x); close_nointr_nofail(sync_fd); @@ -2256,6 +2260,10 @@ int main(int argc, char *argv[]) { _exit(EXIT_FAILURE); } + eventfd_read(sync_fd2, &x); + close_nointr_nofail(sync_fd2); + sync_fd2 = -1; + fdset_free(fds); fds = NULL; -- 1.9.0