]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
attach: introduce sync_wait_pid() and sync_wake_pid()
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 29 Jan 2021 12:51:45 +0000 (13:51 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 29 Jan 2021 12:52:22 +0000 (13:52 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/attach.c

index 58060b44234ba29545763187aa04321a9908b4cc..e519c8b38e25b4f7c24318185e79ea6d4f1178b2 100644 (file)
@@ -1027,6 +1027,16 @@ static inline void lxc_attach_terminal_close_log(struct lxc_terminal *terminal)
        close_prot_errno_disarm(terminal->log_fd);
 }
 
+static inline bool sync_wake_pid(int fd, pid_t pid)
+{
+       return lxc_write_nointr(fd, &pid, sizeof(pid_t)) == sizeof(pid_t);
+}
+
+static inline bool sync_wait_pid(int fd, pid_t *pid)
+{
+       return lxc_read_nointr(fd, pid, sizeof(pid_t)) == sizeof(pid_t);
+}
+
 int lxc_attach(struct lxc_container *container, lxc_attach_exec_t exec_function,
               void *exec_payload, lxc_attach_options_t *options,
               pid_t *attached_process)
@@ -1249,8 +1259,7 @@ int lxc_attach(struct lxc_container *container, lxc_attach_exec_t exec_function,
                        lxc_attach_terminal_close_pts(&terminal);
 
                /* Tell grandparent the pid of the pid of the newly created child. */
-               ret = lxc_write_nointr(ipc_sockets[1], &pid, sizeof(pid));
-               if (ret != sizeof(pid)) {
+               if (!sync_wake_pid(ipc_sockets[1], pid)) {
                        /* If this really happens here, this is very unfortunate, since
                         * the parent will not know the pid of the attached process and
                         * will not be able to wait for it (and we won't either due to
@@ -1331,8 +1340,7 @@ int lxc_attach(struct lxc_container *container, lxc_attach_exec_t exec_function,
        TRACE("Told intermediate process to start initializing");
 
        /* Get pid of attached process from intermediate process. */
-       ret = lxc_read_nointr(ipc_sockets[0], &attached_pid, sizeof(attached_pid));
-       if (ret != sizeof(attached_pid))
+       if (!sync_wait_pid(ipc_sockets[0], &attached_pid))
                goto close_mainloop;
 
        TRACE("Received pid %d of attached process in parent pid namespace", attached_pid);