core/socket: modernize listen/accept_in_cgroup

This commit is contained in:
Mike Yuan
2025-12-20 22:56:33 +01:00
committed by Daan De Meyer
parent 6dcc937568
commit 65d173a02d
+12 -12
View File
@@ -1557,9 +1557,7 @@ static int socket_address_listen_in_cgroup(
const SocketAddress *address,
const char *label) {
_cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
_cleanup_close_pair_ int pair[2] = EBADF_PAIR;
int fd, r;
int r;
assert(s);
assert(address);
@@ -1571,11 +1569,11 @@ static int socket_address_listen_in_cgroup(
if (!fork_needed(address, s)) {
/* Shortcut things... */
fd = socket_address_listen_do(s, address, label);
if (fd < 0)
return log_address_error_errno(UNIT(s), address, fd, "Failed to create listening socket (%s): %m");
r = socket_address_listen_do(s, address, label);
if (r < 0)
return log_address_error_errno(UNIT(s), address, r, "Failed to create listening socket (%s): %m");
return fd;
return r;
}
r = unit_setup_exec_runtime(UNIT(s));
@@ -1605,6 +1603,10 @@ static int socket_address_listen_in_cgroup(
}
}
_cleanup_(pidref_done) PidRef pid = PIDREF_NULL;
_cleanup_close_pair_ int pair[2] = EBADF_PAIR;
_cleanup_close_ int fd = -EBADF;
if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
@@ -1654,15 +1656,13 @@ static int socket_address_listen_in_cgroup(
/* We synchronously wait for the helper, as it shouldn't be slow */
r = pidref_wait_for_terminate_and_check("(sd-listen)", &pid, WAIT_LOG_ABNORMAL);
if (r < 0) {
safe_close(fd);
if (r < 0)
return r;
}
if (fd < 0)
return log_address_error_errno(UNIT(s), address, fd, "Failed to receive listening socket (%s): %m");
return fd;
return TAKE_FD(fd);
}
static int socket_open_fds(Socket *orig_s) {
@@ -3189,7 +3189,7 @@ static int socket_accept_in_cgroup(Socket *s, SocketPort *p, int fd) {
/* If we received no fd, we got EIO here. If this happens with a process exit code of EXIT_SUCCESS
* this is a spurious accept(), let's convert that back to EAGAIN here. */
if (cfd == -EIO)
if (cfd == -EIO && r == EXIT_SUCCESS)
return -EAGAIN;
if (cfd < 0)
return log_unit_error_errno(UNIT(s), cfd, "Failed to receive connection socket: %m");