chiark / gitweb /
bus: make sure to request peer cred only after connect(), not before
authorLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 02:43:43 +0000 (03:43 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 03:20:55 +0000 (04:20 +0100)
src/libsystemd-bus/bus-container.c
src/libsystemd-bus/bus-socket.c
src/libsystemd-bus/bus-socket.h

index 02886c4ded1ab47a6bd9f1aa2d31e204aa3d0750..1989afa82a2749b45b30282d99725623a7f10153 100644 (file)
@@ -52,9 +52,7 @@ int bus_container_connect_socket(sd_bus *b) {
 
         b->output_fd = b->input_fd;
 
-        r = bus_socket_setup(b);
-        if (r < 0)
-                return r;
+        bus_socket_setup(b);
 
         child = fork();
         if (child < 0)
index a7eaf5099d64089018753c5d77ef73b86ad06782..1f5d98063a137d6385a034f58985bb4df70f6a81 100644 (file)
@@ -602,9 +602,8 @@ static int bus_socket_read_auth(sd_bus *b) {
         return 1;
 }
 
-int bus_socket_setup(sd_bus *b) {
+void bus_socket_setup(sd_bus *b) {
         int enable;
-        socklen_t l;
 
         assert(b);
 
@@ -620,16 +619,20 @@ int bus_socket_setup(sd_bus *b) {
         fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE);
         fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE);
 
-        /* Get the peer for socketpair() sockets */
-        l = sizeof(b->ucred);
-        if (getsockopt(b->input_fd, SOL_SOCKET, SO_PEERCRED, &b->ucred, &l) >= 0 && l >= sizeof(b->ucred))
-                b->ucred_valid = b->ucred.pid > 0;
-
         b->is_kernel = false;
         b->message_version = 1;
         b->message_endian = 0;
+}
 
-        return 0;
+static void bus_get_peercred(sd_bus *b) {
+        socklen_t l;
+
+        assert(b);
+
+        /* Get the peer for socketpair() sockets */
+        l = sizeof(b->ucred);
+        if (getsockopt(b->input_fd, SOL_SOCKET, SO_PEERCRED, &b->ucred, &l) >= 0 && l >= sizeof(b->ucred))
+                b->ucred_valid = b->ucred.pid > 0;
 }
 
 static int bus_socket_start_auth_client(sd_bus *b) {
@@ -677,6 +680,8 @@ static int bus_socket_start_auth_client(sd_bus *b) {
 int bus_socket_start_auth(sd_bus *b) {
         assert(b);
 
+        bus_get_peercred(b);
+
         b->state = BUS_AUTHENTICATING;
         b->auth_timeout = now(CLOCK_MONOTONIC) + BUS_DEFAULT_TIMEOUT;
 
@@ -707,9 +712,7 @@ int bus_socket_connect(sd_bus *b) {
 
         b->output_fd = b->input_fd;
 
-        r = bus_socket_setup(b);
-        if (r < 0)
-                return r;
+        bus_socket_setup(b);
 
         r = connect(b->input_fd, &b->sockaddr.sa, b->sockaddr_size);
         if (r < 0) {
@@ -771,20 +774,15 @@ int bus_socket_exec(sd_bus *b) {
         close_nointr_nofail(s[1]);
         b->output_fd = b->input_fd = s[0];
 
-        r = bus_socket_setup(b);
-        if (r < 0)
-                return r;
+        bus_socket_setup(b);
 
         return bus_socket_start_auth(b);
 }
 
 int bus_socket_take_fd(sd_bus *b) {
-        int  r;
         assert(b);
 
-        r = bus_socket_setup(b);
-        if (r < 0)
-                return r;
+        bus_socket_setup(b);
 
         return bus_socket_start_auth(b);
 }
index f959787e7daf00b015b32efecfada12a1edf0821..5a1c7d4cf2c9d6eccfa189f8c5acb64c4fb3efe0 100644 (file)
@@ -23,7 +23,8 @@
 
 #include "sd-bus.h"
 
-int bus_socket_setup(sd_bus *b);
+void bus_socket_setup(sd_bus *b);
+
 int bus_socket_connect(sd_bus *b);
 int bus_socket_exec(sd_bus *b);
 int bus_socket_take_fd(sd_bus *b);