chiark / gitweb /
bus: when getting a kdbus connection into a container wait first for child, then...
authorLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 18:10:11 +0000 (19:10 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 18:10:11 +0000 (19:10 +0100)
There's no EOF generated for AF_UNIX/SOCK_DGRAM sockets, hence let's
wait for the child first to see if it succeeded, only then read the socket.

src/libsystemd-bus/bus-container.c
src/machine/machinectl.c
src/shared/logs-show.c

index 1989afa82a2749b45b30282d99725623a7f10153..d330363b6f89dad199be3103ee36991e113dfcd2 100644 (file)
@@ -205,6 +205,16 @@ int bus_container_connect_kernel(sd_bus *b) {
         close_nointr_nofail(pair[1]);
         pair[1] = -1;
 
+        r = wait_for_terminate(child, &si);
+        if (r < 0)
+                return r;
+
+        if (si.si_code != CLD_EXITED)
+                return -EIO;
+
+        if (si.si_status != EXIT_SUCCESS)
+                return -EIO;
+
         if (recvmsg(pair[0], &mh, MSG_NOSIGNAL|MSG_CMSG_CLOEXEC) < 0)
                 return -errno;
 
@@ -224,16 +234,6 @@ int bus_container_connect_kernel(sd_bus *b) {
                         fd = fds[0];
                 }
 
-        r = wait_for_terminate(child, &si);
-        if (r < 0)
-                return r;
-
-        if (si.si_code != CLD_EXITED)
-                return -EIO;
-
-        if (si.si_status != EXIT_SUCCESS)
-                return -EIO;
-
         b->input_fd = b->output_fd = fd;
         fd = -1;
 
index a2af87c17d2ccea40f9e76cab6375e7978a52d25..ab9060ab9923397924cb994eb5a0a3ae69c20732 100644 (file)
@@ -451,6 +451,15 @@ static int openpt_in_namespace(pid_t pid, int flags) {
         close_nointr_nofail(pair[1]);
         pair[1] = -1;
 
+        r = wait_for_terminate(child, &si);
+        if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS || master < 0) {
+
+                if (master >= 0)
+                        close_nointr_nofail(master);
+
+                return r < 0 ? r : -EIO;
+        }
+
         if (recvmsg(pair[0], &mh, MSG_NOSIGNAL|MSG_CMSG_CLOEXEC) < 0)
                 return -errno;
 
@@ -470,15 +479,6 @@ static int openpt_in_namespace(pid_t pid, int flags) {
                         master = fds[0];
                 }
 
-        r = wait_for_terminate(child, &si);
-        if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS || master < 0) {
-
-                if (master >= 0)
-                        close_nointr_nofail(master);
-
-                return r < 0 ? r : -EIO;
-        }
-
         return master;
 }
 
index 0f27c4ee41546fa73ca68fe800bc852247a3f9a7..61c3652bd5ae32943d020f3f4e98f241071de9f9 100644 (file)
@@ -1174,14 +1174,14 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) {
         close_nointr_nofail(pair[1]);
         pair[1] = -1;
 
-        k = recv(pair[0], buf, 36, 0);
-        if (k != 36)
-                return -EIO;
-
         r = wait_for_terminate(child, &si);
         if (r < 0 || si.si_code != CLD_EXITED || si.si_status != EXIT_SUCCESS)
                 return r < 0 ? r : -EIO;
 
+        k = recv(pair[0], buf, 36, 0);
+        if (k != 36)
+                return -EIO;
+
         buf[36] = 0;
         r = sd_id128_from_string(buf, boot_id);
         if (r < 0)