hurd: Implement MSG_CMSG_CLOEXEC

This is a new flag that can be passed to recvmsg () to make it
atomically set the CLOEXEC flag on all the file descriptors received
using the SCM_RIGHTS mechanism. This is useful for all the same reasons
that the other XXX_CLOEXEC flags are useful: namely, it provides
atomicity with respect to another thread of the same process calling
(fork and then) exec at the same time.

This flag is already supported on Linux and FreeBSD. The flag's value,
0x40000, is choosen to match FreeBSD's.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20230423160548.126576-2-bugaevc@gmail.com>
This commit is contained in:
Sergey Bugaev 2023-04-23 19:05:46 +03:00 committed by Samuel Thibault
parent 0822e3552a
commit 5fa8945605
2 changed files with 7 additions and 2 deletions

View File

@ -197,8 +197,11 @@ enum
#define MSG_WAITALL MSG_WAITALL
MSG_DONTWAIT = 0x80, /* This message should be nonblocking. */
#define MSG_DONTWAIT MSG_DONTWAIT
MSG_NOSIGNAL = 0x0400 /* Do not generate SIGPIPE on EPIPE. */
MSG_NOSIGNAL = 0x0400, /* Do not generate SIGPIPE on EPIPE. */
#define MSG_NOSIGNAL MSG_NOSIGNAL
MSG_CMSG_CLOEXEC = 0x40000 /* Atomically set close-on-exec flag
for file descriptors in SCM_RIGHTS. */
#define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
};

View File

@ -197,11 +197,13 @@ __libc_recvmsg (int fd, struct msghdr *message, int flags)
for (j = 0; j < nfds; j++)
{
int fd_flags = (flags & MSG_CMSG_CLOEXEC) ? O_CLOEXEC : 0;
err = reauthenticate (ports[i], &newports[newfds]);
if (err)
goto cleanup;
fds[j] = opened_fds[newfds] = _hurd_intern_fd (newports[newfds],
fds[j], 0);
fds[j] | fd_flags,
0);
if (fds[j] == -1)
{
err = errno;