The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=04a481b743c56392c34d5250327895bdb84b1160

commit 04a481b743c56392c34d5250327895bdb84b1160
Author:     Ricardo Branco <rbra...@suse.de>
AuthorDate: 2025-05-09 21:39:46 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2025-07-06 23:08:24 +0000

    socket: Add SOCK_CLOFORK flag
    
    Reviewed by:    kib
    MFC after:      1 month
    Pull Request:   https://github.com/freebsd/freebsd-src/pull/1698
---
 sys/kern/uipc_syscalls.c | 13 +++++++++++--
 sys/sys/socket.h         |  3 ++-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index ad8485028987..133724ac76c5 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -151,6 +151,10 @@ kern_socket(struct thread *td, int domain, int type, int 
protocol)
                type &= ~SOCK_CLOEXEC;
                oflag |= O_CLOEXEC;
        }
+       if ((type & SOCK_CLOFORK) != 0) {
+               type &= ~SOCK_CLOFORK;
+               oflag |= O_CLOFORK;
+       }
        if ((type & SOCK_NONBLOCK) != 0) {
                type &= ~SOCK_NONBLOCK;
                fflag |= FNONBLOCK;
@@ -352,7 +356,8 @@ kern_accept4(struct thread *td, int s, struct sockaddr *sa, 
int flags,
                goto done;
 #endif
        error = falloc_caps(td, &nfp, &fd,
-           (flags & SOCK_CLOEXEC) ? O_CLOEXEC : 0, &fcaps);
+           ((flags & SOCK_CLOEXEC) != 0 ? O_CLOEXEC : 0) |
+           ((flags & SOCK_CLOFORK) != 0 ? O_CLOFORK : 0), &fcaps);
        if (error != 0)
                goto done;
        SOCK_LOCK(head);
@@ -435,7 +440,7 @@ int
 sys_accept4(struct thread *td, struct accept4_args *uap)
 {
 
-       if (uap->flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+       if ((uap->flags & ~(SOCK_CLOEXEC | SOCK_CLOFORK | SOCK_NONBLOCK)) != 0)
                return (EINVAL);
 
        return (accept1(td, uap->s, uap->name, uap->anamelen, uap->flags));
@@ -557,6 +562,10 @@ kern_socketpair(struct thread *td, int domain, int type, 
int protocol,
                type &= ~SOCK_CLOEXEC;
                oflag |= O_CLOEXEC;
        }
+       if ((type & SOCK_CLOFORK) != 0) {
+               type &= ~SOCK_CLOFORK;
+               oflag |= O_CLOFORK;
+       }
        if ((type & SOCK_NONBLOCK) != 0) {
                type &= ~SOCK_NONBLOCK;
                fflag |= FNONBLOCK;
diff --git a/sys/sys/socket.h b/sys/sys/socket.h
index 5e7c554c34cf..8db981c9747c 100644
--- a/sys/sys/socket.h
+++ b/sys/sys/socket.h
@@ -111,10 +111,11 @@ typedef   __uintptr_t     uintptr_t;
  */
 #define        SOCK_CLOEXEC    0x10000000
 #define        SOCK_NONBLOCK   0x20000000
+#define        SOCK_CLOFORK    0x40000000
 #ifdef _KERNEL
 /*
  * Flags for accept1(), kern_accept4() and solisten_dequeue, in addition
- * to SOCK_CLOEXEC and SOCK_NONBLOCK.
+ * to SOCK_CLOEXEC, SOCK_CLOFORK and SOCK_NONBLOCK.
  */
 #define ACCEPT4_INHERIT 0x1
 #define ACCEPT4_COMPAT  0x2

Reply via email to