]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-ctrl: enable SO_PASSCREDS on listening socket already rather than on accept()
authorMike Yuan <me@yhndnzj.com>
Fri, 6 Jun 2025 18:06:45 +0000 (20:06 +0200)
committerMike Yuan <me@yhndnzj.com>
Tue, 17 Jun 2025 11:16:07 +0000 (13:16 +0200)
This matches what systemd-udevd-control.socket does.

src/udev/udev-ctrl.c

index 5cde769b1f62a94fbe287202a37cc282a18de036..eeaa0c01f3ee4d754245b397f416cbe789ba96de 100644 (file)
@@ -44,6 +44,7 @@ struct UdevCtrl {
 int udev_ctrl_new_from_fd(UdevCtrl **ret, int fd) {
         _cleanup_close_ int sock = -EBADF;
         UdevCtrl *uctrl;
+        int r;
 
         assert(ret);
 
@@ -53,6 +54,11 @@ int udev_ctrl_new_from_fd(UdevCtrl **ret, int fd) {
                         return log_error_errno(errno, "Failed to create socket: %m");
         }
 
+        /* enable receiving of the sender credentials in the messages */
+        r = setsockopt_int(fd >= 0 ? fd : sock, SOL_SOCKET, SO_PASSCRED, true);
+        if (r < 0)
+                log_warning_errno(r, "Failed to set SO_PASSCRED, ignoring: %m");
+
         uctrl = new(UdevCtrl, 1);
         if (!uctrl)
                 return -ENOMEM;
@@ -240,11 +246,6 @@ static int udev_ctrl_event_handler(sd_event_source *s, int fd, uint32_t revents,
                 return 0;
         }
 
-        /* enable receiving of the sender credentials in the messages */
-        r = setsockopt_int(sock, SOL_SOCKET, SO_PASSCRED, true);
-        if (r < 0)
-                log_warning_errno(r, "Failed to set SO_PASSCRED, ignoring: %m");
-
         r = sd_event_add_io(uctrl->event, &uctrl->event_source_connect, sock, EPOLLIN, udev_ctrl_connection_event_handler, uctrl);
         if (r < 0) {
                 log_error_errno(r, "Failed to create event source for udev control connection: %m");