]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: use the return value from sockaddr_un_set_path()
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 2 Mar 2020 14:51:31 +0000 (15:51 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 2 Mar 2020 14:55:44 +0000 (15:55 +0100)
It fully initializes the address structure, so no need for pre-initialization,
and also returns the length of the address, so no need to recalculate using
SOCKADDR_UN_LEN().

socklen_t is unsigned, so let's not use an int for it. (It doesn't matter, but
seems cleaner and more portable to not assume anything about the type.)

15 files changed:
src/core/dbus.c
src/core/execute.c
src/core/manager.c
src/journal/journald-native.c
src/journal/journald-server.c
src/journal/journald-stream.c
src/journal/journald-syslog.c
src/libsystemd/sd-bus/test-bus-watch-bind.c
src/libsystemd/sd-daemon/sd-daemon.c
src/login/pam_systemd.c
src/shared/ask-password-api.c
src/shared/varlink.c
src/socket-proxy/socket-proxyd.c
src/tty-ask-password-agent/tty-ask-password-agent.c
src/userdb/userdbctl.c

index db3148bf4a3ee4650f108a59ecacedfb72edfa57..50155f22c6725a9543e463c3bf7182dbb4982930 100644 (file)
@@ -865,9 +865,10 @@ int bus_init_system(Manager *m) {
 
 int bus_init_private(Manager *m) {
         _cleanup_close_ int fd = -1;
-        union sockaddr_union sa = {};
+        union sockaddr_union sa;
+        socklen_t sa_len;
         sd_event_source *s;
-        int r, salen;
+        int r;
 
         assert(m);
 
@@ -880,7 +881,7 @@ int bus_init_private(Manager *m) {
                 if (getpid_cached() != 1)
                         return 0;
 
-                salen = sockaddr_un_set_path(&sa.un, "/run/systemd/private");
+                r = sockaddr_un_set_path(&sa.un, "/run/systemd/private");
         } else {
                 const char *e, *joined;
 
@@ -890,10 +891,11 @@ int bus_init_private(Manager *m) {
                                                "XDG_RUNTIME_DIR is not set, refusing.");
 
                 joined = strjoina(e, "/systemd/private");
-                salen = sockaddr_un_set_path(&sa.un, joined);
+                r = sockaddr_un_set_path(&sa.un, joined);
         }
-        if (salen < 0)
-                return log_error_errno(salen, "Can't set path for AF_UNIX socket to bind to: %m");
+        if (r < 0)
+                return log_error_errno(r, "Can't set path for AF_UNIX socket to bind to: %m");
+        sa_len = r;
 
         (void) mkdir_parents_label(sa.un.sun_path, 0755);
         (void) sockaddr_un_unlink(&sa.un);
@@ -902,7 +904,7 @@ int bus_init_private(Manager *m) {
         if (fd < 0)
                 return log_error_errno(errno, "Failed to allocate private socket: %m");
 
-        r = bind(fd, &sa.sa, salen);
+        r = bind(fd, &sa.sa, sa_len);
         if (r < 0)
                 return log_error_errno(errno, "Failed to bind private socket: %m");
 
index 3911363c54e027cd6745b667fbef9add72afabdd..58055a33c4d586cb1bed1f61e73e929fcddaf1cd 100644 (file)
@@ -271,9 +271,8 @@ static int connect_journal_socket(
                 uid_t uid,
                 gid_t gid) {
 
-        union sockaddr_union sa = {
-                .un.sun_family = AF_UNIX,
-        };
+        union sockaddr_union sa;
+        socklen_t sa_len;
         uid_t olduid = UID_INVALID;
         gid_t oldgid = GID_INVALID;
         const char *j;
@@ -285,6 +284,7 @@ static int connect_journal_socket(
         r = sockaddr_un_set_path(&sa.un, j);
         if (r < 0)
                 return r;
+        sa_len = r;
 
         if (gid_is_valid(gid)) {
                 oldgid = getgid();
@@ -302,7 +302,7 @@ static int connect_journal_socket(
                 }
         }
 
-        r = connect(fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)) < 0 ? -errno : 0;
+        r = connect(fd, &sa.sa, sa_len) < 0 ? -errno : 0;
 
         /* If we fail to restore the uid or gid, things will likely
            fail later on. This should only happen if an LSM interferes. */
index a5290eba0c682789821f2ca784bf8bf88dbb56fa..c2d8bbe84e11f53c99eef9eed53c58195b404b35 100644 (file)
@@ -917,8 +917,8 @@ static int manager_setup_notify(Manager *m) {
 
         if (m->notify_fd < 0) {
                 _cleanup_close_ int fd = -1;
-                union sockaddr_union sa = {};
-                int salen;
+                union sockaddr_union sa;
+                socklen_t sa_len;
 
                 /* First free all secondary fields */
                 m->notify_socket = mfree(m->notify_socket);
@@ -934,14 +934,16 @@ static int manager_setup_notify(Manager *m) {
                 if (!m->notify_socket)
                         return log_oom();
 
-                salen = sockaddr_un_set_path(&sa.un, m->notify_socket);
-                if (salen < 0)
-                        return log_error_errno(salen, "Notify socket '%s' not valid for AF_UNIX socket address, refusing.", m->notify_socket);
+                r = sockaddr_un_set_path(&sa.un, m->notify_socket);
+                if (r < 0)
+                        return log_error_errno(r, "Notify socket '%s' not valid for AF_UNIX socket address, refusing.",
+                                               m->notify_socket);
+                sa_len = r;
 
                 (void) mkdir_parents_label(m->notify_socket, 0755);
                 (void) sockaddr_un_unlink(&sa.un);
 
-                r = bind(fd, &sa.sa, salen);
+                r = bind(fd, &sa.sa, sa_len);
                 if (r < 0)
                         return log_error_errno(errno, "bind(%s) failed: %m", m->notify_socket);
 
index 30d988544f38727bcb6c290faae435d23056cc06..f2b867da3d3cd5e1993157fe1217df3f8a2f4db9 100644 (file)
@@ -457,13 +457,13 @@ int server_open_native_socket(Server *s, const char *native_socket) {
         assert(native_socket);
 
         if (s->native_fd < 0) {
-                union sockaddr_union sa = {
-                        .un.sun_family = AF_UNIX,
-                };
+                union sockaddr_union sa;
+                size_t sa_len;
 
                 r = sockaddr_un_set_path(&sa.un, native_socket);
                 if (r < 0)
                         return log_error_errno(r, "Unable to use namespace path %s for AF_UNIX socket: %m", native_socket);
+                sa_len = r;
 
                 s->native_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (s->native_fd < 0)
@@ -471,7 +471,7 @@ int server_open_native_socket(Server *s, const char *native_socket) {
 
                 (void) sockaddr_un_unlink(&sa.un);
 
-                r = bind(s->native_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un));
+                r = bind(s->native_fd, &sa.sa, sa_len);
                 if (r < 0)
                         return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
 
index eb124aa73f4c05b56c31a321cad14d2adcc57561..489730df8ff7e1af884dd92c933eb6d2385aa0ff 100644 (file)
@@ -1840,9 +1840,10 @@ static int dispatch_watchdog(sd_event_source *es, uint64_t usec, void *userdata)
 }
 
 static int server_connect_notify(Server *s) {
-        union sockaddr_union sa = {};
+        union sockaddr_union sa;
+        socklen_t sa_len;
         const char *e;
-        int r, salen;
+        int r;
 
         assert(s);
         assert(s->notify_fd < 0);
@@ -1865,9 +1866,10 @@ static int server_connect_notify(Server *s) {
         if (!e)
                 return 0;
 
-        salen = sockaddr_un_set_path(&sa.un, e);
-        if (salen < 0)
-                return log_error_errno(salen, "NOTIFY_SOCKET set to invalid value '%s': %m", e);
+        r = sockaddr_un_set_path(&sa.un, e);
+        if (r < 0)
+                return log_error_errno(r, "NOTIFY_SOCKET set to invalid value '%s': %m", e);
+        sa_len = r;
 
         s->notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (s->notify_fd < 0)
@@ -1875,7 +1877,7 @@ static int server_connect_notify(Server *s) {
 
         (void) fd_inc_sndbuf(s->notify_fd, NOTIFY_SNDBUF_SIZE);
 
-        r = connect(s->notify_fd, &sa.sa, salen);
+        r = connect(s->notify_fd, &sa.sa, sa_len);
         if (r < 0)
                 return log_error_errno(errno, "Failed to connect to notify socket: %m");
 
index 97e0b69de857a3d3151658100fa54bc0be669802..609af506a429d12ebca2e91bab88703485a940c7 100644 (file)
@@ -849,13 +849,13 @@ int server_open_stdout_socket(Server *s, const char *stdout_socket) {
         assert(stdout_socket);
 
         if (s->stdout_fd < 0) {
-                union sockaddr_union sa = {
-                        .un.sun_family = AF_UNIX,
-                };
+                union sockaddr_union sa;
+                socklen_t sa_len;
 
                 r = sockaddr_un_set_path(&sa.un, stdout_socket);
                 if (r < 0)
                         return log_error_errno(r, "Unable to use namespace path %s for AF_UNIX socket: %m", stdout_socket);
+                sa_len = r;
 
                 s->stdout_fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (s->stdout_fd < 0)
@@ -863,7 +863,7 @@ int server_open_stdout_socket(Server *s, const char *stdout_socket) {
 
                 (void) sockaddr_un_unlink(&sa.un);
 
-                r = bind(s->stdout_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un));
+                r = bind(s->stdout_fd, &sa.sa, sa_len);
                 if (r < 0)
                         return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
 
index 2a5749517e6ee2ab745cdbf654cf4a9567dc216f..1325b563854f6f5da2f9b41def2dc3abdb7712c6 100644 (file)
@@ -461,13 +461,13 @@ int server_open_syslog_socket(Server *s, const char *syslog_socket) {
         assert(syslog_socket);
 
         if (s->syslog_fd < 0) {
-                union sockaddr_union sa = {
-                        .un.sun_family = AF_UNIX,
-                };
+                union sockaddr_union sa;
+                socklen_t sa_len;
 
                 r = sockaddr_un_set_path(&sa.un, syslog_socket);
                 if (r < 0)
                         return log_error_errno(r, "Unable to use namespace path %s for AF_UNIX socket: %m", syslog_socket);
+                sa_len = r;
 
                 s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (s->syslog_fd < 0)
@@ -475,7 +475,7 @@ int server_open_syslog_socket(Server *s, const char *syslog_socket) {
 
                 (void) sockaddr_un_unlink(&sa.un);
 
-                r = bind(s->syslog_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un));
+                r = bind(s->syslog_fd, &sa.sa, sa_len);
                 if (r < 0)
                         return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path);
 
index 2723866e08472c837466dd8da108318e34247517..7ded9386b75023f80e77277c35e0f0b8e5cb5ad9 100644 (file)
@@ -41,9 +41,9 @@ static const sd_bus_vtable vtable[] = {
 static void* thread_server(void *p) {
         _cleanup_free_ char *suffixed = NULL, *suffixed2 = NULL, *d = NULL;
         _cleanup_close_ int fd = -1;
-        union sockaddr_union u = {};
+        union sockaddr_union u;
         const char *path = p;
-        int salen;
+        int r;
 
         log_debug("Initializing server");
 
@@ -66,13 +66,15 @@ static void* thread_server(void *p) {
         assert_se(symlink(basename(suffixed), suffixed2) >= 0);
         (void) usleep(100 * USEC_PER_MSEC);
 
-        salen = sockaddr_un_set_path(&u.un, path);
-        assert_se(salen >= 0);
+        socklen_t sa_len;
+        r = sockaddr_un_set_path(&u.un, path);
+        assert_se(r >= 0);
+        sa_len = r;
 
         fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
         assert_se(fd >= 0);
 
-        assert_se(bind(fd, &u.sa, salen) >= 0);
+        assert_se(bind(fd, &u.sa, sa_len) >= 0);
         usleep(100 * USEC_PER_MSEC);
 
         assert_se(listen(fd, SOMAXCONN) >= 0);
index ff71194331b08fa43497da23db9300ff64f9bed7..4cd71cb2d3a022e6534fce90e6f0a89b589d5dfa 100644 (file)
@@ -443,7 +443,7 @@ _public_ int sd_pid_notify_with_fds(
                 const int *fds,
                 unsigned n_fds) {
 
-        union sockaddr_union sockaddr = {};
+        union sockaddr_union sockaddr;
         struct iovec iovec;
         struct msghdr msghdr = {
                 .msg_iov = &iovec,
@@ -454,7 +454,7 @@ _public_ int sd_pid_notify_with_fds(
         struct cmsghdr *cmsg = NULL;
         const char *e;
         bool send_ucred;
-        int r, salen;
+        int r;
 
         if (!state) {
                 r = -EINVAL;
@@ -470,11 +470,10 @@ _public_ int sd_pid_notify_with_fds(
         if (!e)
                 return 0;
 
-        salen = sockaddr_un_set_path(&sockaddr.un, e);
-        if (salen < 0) {
-                r = salen;
+        r = sockaddr_un_set_path(&sockaddr.un, e);
+        if (r < 0)
                 goto finish;
-        }
+        msghdr.msg_namelen = r;
 
         fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
         if (fd < 0) {
@@ -485,7 +484,6 @@ _public_ int sd_pid_notify_with_fds(
         (void) fd_inc_sndbuf(fd, SNDBUF_SIZE);
 
         iovec = IOVEC_MAKE_STRING(state);
-        msghdr.msg_namelen = salen;
 
         send_ucred =
                 (pid != 0 && pid != getpid_cached()) ||
index 8447e1c555f9a2a54d3dda4fe45b9a625fbb9522..84bea21ab7be0777899a2d35c5b56cecaab00471 100644 (file)
@@ -219,11 +219,12 @@ static int socket_from_display(const char *display, char **path) {
 }
 
 static int get_seat_from_display(const char *display, const char **seat, uint32_t *vtnr) {
-        union sockaddr_union sa = {};
+        union sockaddr_union sa;
+        socklen_t sa_len;
         _cleanup_free_ char *p = NULL, *sys_path = NULL, *tty = NULL;
         _cleanup_close_ int fd = -1;
         struct ucred ucred;
-        int v, r, salen;
+        int v, r;
         dev_t display_ctty;
 
         assert(display);
@@ -238,15 +239,16 @@ static int get_seat_from_display(const char *display, const char **seat, uint32_
         r = socket_from_display(display, &p);
         if (r < 0)
                 return r;
-        salen = sockaddr_un_set_path(&sa.un, p);
-        if (salen < 0)
-                return salen;
+        r = sockaddr_un_set_path(&sa.un, p);
+        if (r < 0)
+                return r;
+        sa_len = r;
 
         fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
         if (fd < 0)
                 return -errno;
 
-        if (connect(fd, &sa.sa, salen) < 0)
+        if (connect(fd, &sa.sa, sa_len) < 0)
                 return -errno;
 
         r = getpeercred(fd, &ucred);
index 7abe7d17115661082d48364a544ad2a3914379f1..ce2e9e9b8cefd9317aedaa7f3e447cbda0ec83c0 100644 (file)
@@ -696,9 +696,10 @@ finish:
 
 static int create_socket(char **ret) {
         _cleanup_free_ char *path = NULL;
-        union sockaddr_union sa = {};
+        union sockaddr_union sa;
+        socklen_t sa_len;
         _cleanup_close_ int fd = -1;
-        int salen, r;
+        int r;
 
         assert(ret);
 
@@ -709,12 +710,13 @@ static int create_socket(char **ret) {
         if (asprintf(&path, "/run/systemd/ask-password/sck.%" PRIx64, random_u64()) < 0)
                 return -ENOMEM;
 
-        salen = sockaddr_un_set_path(&sa.un, path);
-        if (salen < 0)
-                return salen;
+        r = sockaddr_un_set_path(&sa.un, path);
+        if (r < 0)
+                return r;
+        sa_len = r;
 
         RUN_WITH_UMASK(0177) {
-                if (bind(fd, &sa.sa, salen) < 0)
+                if (bind(fd, &sa.sa, sa_len) < 0)
                         return -errno;
         }
 
index 012ce5308c1c7131637a8becde6ec31283744c48..dff7d32535d5bc0dfba9ddc25ab4818c43e94610 100644 (file)
@@ -271,6 +271,7 @@ static int varlink_new(Varlink **ret) {
 int varlink_connect_address(Varlink **ret, const char *address) {
         _cleanup_(varlink_unrefp) Varlink *v = NULL;
         union sockaddr_union sockaddr;
+        socklen_t sockaddr_len;
         int r;
 
         assert_return(ret, -EINVAL);
@@ -279,6 +280,7 @@ int varlink_connect_address(Varlink **ret, const char *address) {
         r = sockaddr_un_set_path(&sockaddr.un, address);
         if (r < 0)
                 return r;
+        sockaddr_len = r;
 
         r = varlink_new(&v);
         if (r < 0)
@@ -290,7 +292,7 @@ int varlink_connect_address(Varlink **ret, const char *address) {
 
         v->fd = fd_move_above_stdio(v->fd);
 
-        if (connect(v->fd, &sockaddr.sa, SOCKADDR_UN_LEN(sockaddr.un)) < 0) {
+        if (connect(v->fd, &sockaddr.sa, sockaddr_len) < 0) {
                 if (!IN_SET(errno, EAGAIN, EINPROGRESS))
                         return -errno;
 
@@ -2224,6 +2226,7 @@ int varlink_server_listen_fd(VarlinkServer *s, int fd) {
 
 int varlink_server_listen_address(VarlinkServer *s, const char *address, mode_t m) {
         union sockaddr_union sockaddr;
+        socklen_t sockaddr_len;
         _cleanup_close_ int fd = -1;
         int r;
 
@@ -2234,6 +2237,7 @@ int varlink_server_listen_address(VarlinkServer *s, const char *address, mode_t
         r = sockaddr_un_set_path(&sockaddr.un, address);
         if (r < 0)
                 return r;
+        sockaddr_len = r;
 
         fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (fd < 0)
@@ -2244,7 +2248,7 @@ int varlink_server_listen_address(VarlinkServer *s, const char *address, mode_t
         (void) sockaddr_un_unlink(&sockaddr.un);
 
         RUN_WITH_UMASK(~m & 0777)
-                if (bind(fd, &sockaddr.sa, SOCKADDR_UN_LEN(sockaddr.un)) < 0)
+                if (bind(fd, &sockaddr.sa, sockaddr_len) < 0)
                         return -errno;
 
         if (listen(fd, SOMAXCONN) < 0)
index 2fb9c854fa504ba000b3b4073efeba5703243207..2ee6fc2f0a6aa0fcf4fbf2539cc4ba475875262b 100644 (file)
@@ -373,20 +373,21 @@ static int resolve_remote(Connection *c) {
                 .ai_flags = AI_ADDRCONFIG
         };
 
-        union sockaddr_union sa = {};
         const char *node, *service;
         int r;
 
         if (IN_SET(arg_remote_host[0], '/', '@')) {
-                int salen;
+                union sockaddr_union sa;
+                int sa_len;
 
-                salen = sockaddr_un_set_path(&sa.un, arg_remote_host);
-                if (salen < 0) {
-                        log_error_errno(salen, "Specified address doesn't fit in an AF_UNIX address, refusing: %m");
+                r = sockaddr_un_set_path(&sa.un, arg_remote_host);
+                if (r < 0) {
+                        log_error_errno(r, "Specified address doesn't fit in an AF_UNIX address, refusing: %m");
                         goto fail;
                 }
+                sa_len = r;
 
-                return connection_start(c, &sa.sa, salen);
+                return connection_start(c, &sa.sa, sa_len);
         }
 
         service = strrchr(arg_remote_host, ':');
index 784dd0df72da769834b5c8cc88aaaf3dfbfe2fc0..0e33c0b48f01564792080235f43a98d692920a87 100644 (file)
@@ -57,17 +57,19 @@ static const char *arg_device = NULL;
 static int send_passwords(const char *socket_name, char **passwords) {
         _cleanup_(erase_and_freep) char *packet = NULL;
         _cleanup_close_ int socket_fd = -1;
-        union sockaddr_union sa = {};
+        union sockaddr_union sa;
+        socklen_t sa_len;
         size_t packet_length = 1;
         char **p, *d;
         ssize_t n;
-        int salen;
+        int r;
 
         assert(socket_name);
 
-        salen = sockaddr_un_set_path(&sa.un, socket_name);
-        if (salen < 0)
-                return salen;
+        r = sockaddr_un_set_path(&sa.un, socket_name);
+        if (r < 0)
+                return r;
+        sa_len = r;
 
         STRV_FOREACH(p, passwords)
                 packet_length += strlen(*p) + 1;
@@ -86,7 +88,7 @@ static int send_passwords(const char *socket_name, char **passwords) {
         if (socket_fd < 0)
                 return log_debug_errno(errno, "socket(): %m");
 
-        n = sendto(socket_fd, packet, packet_length, MSG_NOSIGNAL, &sa.sa, salen);
+        n = sendto(socket_fd, packet, packet_length, MSG_NOSIGNAL, &sa.sa, sa_len);
         if (n < 0)
                 return log_debug_errno(errno, "sendto(): %m");
 
index 715f0d236b8d4a9cc5e363333cd3096439f4b04a..b3ddd9d14158392e5eb6b2c158e97a429ed7eeba 100644 (file)
@@ -494,6 +494,7 @@ static int display_services(int argc, char *argv[], void *userdata) {
         FOREACH_DIRENT(de, d, return -errno) {
                 _cleanup_free_ char *j = NULL, *no = NULL;
                 union sockaddr_union sockaddr;
+                socklen_t sockaddr_len;
                 _cleanup_close_ int fd = -1;
 
                 j = path_join("/run/systemd/userdb/", de->d_name);
@@ -503,12 +504,13 @@ static int display_services(int argc, char *argv[], void *userdata) {
                 r = sockaddr_un_set_path(&sockaddr.un, j);
                 if (r < 0)
                         return log_error_errno(r, "Path %s does not fit in AF_UNIX socket address: %m", j);
+                sockaddr_len = r;
 
                 fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (fd < 0)
                         return log_error_errno(r, "Failed to allocate AF_UNIX/SOCK_STREAM socket: %m");
 
-                if (connect(fd, &sockaddr.un, SOCKADDR_UN_LEN(sockaddr.un)) < 0) {
+                if (connect(fd, &sockaddr.un, sockaddr_len) < 0) {
                         no = strjoin("No (", errno_to_name(errno), ")");
                         if (!no)
                                 return log_oom();