[glibc/release/2.39/master] include: isolate __O_CLOEXEC flag for sys/mount.h and fcntl.h

Florian Weimer via Glibc-cvs <[email protected]>
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=98bc06a361be9eb3ab101c74b0905c0f6abf4d85

commit 98bc06a361be9eb3ab101c74b0905c0f6abf4d85
Author: DJ Delorie <[email protected]>
Date:   Mon Jan 26 22:24:42 2026 -0500

    include: isolate __O_CLOEXEC flag for sys/mount.h and fcntl.h
    
    Including sys/mount.h should not implicitly include fcntl.h
    as that causes namespace pollution and conflicts with kernel
    headers.  It only needs O_CLOEXEC for OPEN_TREE_CLOEXEC
    (although it shouldn't need that, but it's defined that way)
    so we provide that define (via a private version) separately.
    
    Reviewed-by: Adhemerval Zanella  <[email protected]>
    Tested-by: Florian Weimer <[email protected]>
    (cherry picked from commit 419245719ccbc7dad6a97f24465e7f09c090327a)

Diff:
---
 io/fcntl.c                                   | 4 ++++
 sysdeps/unix/sysv/linux/Makefile             | 1 +
 sysdeps/unix/sysv/linux/alpha/bits/cloexec.h | 1 +
 sysdeps/unix/sysv/linux/bits/cloexec.h       | 1 +
 sysdeps/unix/sysv/linux/bits/fcntl-linux.h   | 4 +---
 sysdeps/unix/sysv/linux/hppa/bits/cloexec.h  | 1 +
 sysdeps/unix/sysv/linux/sparc/bits/cloexec.h | 1 +
 sysdeps/unix/sysv/linux/sys/mount.h          | 6 +++++-
 sysdeps/unix/sysv/linux/tst-mount.c          | 1 +
 9 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/io/fcntl.c b/io/fcntl.c
index 10960699f2..a221e7658b 100644
--- a/io/fcntl.c
+++ b/io/fcntl.c
@@ -18,6 +18,10 @@
 #include <errno.h>
 #include <fcntl.h>
 
+#ifndef __O_CLOEXEC
+# error __O_CLOEXEC not defined by fcntl.h/cloexec.h
+#endif
+
 /* Perform file control operations on FD.  */
 int
 __fcntl (int fd, int cmd, ...)
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index a7938a86ac..2dbc1e6ed0 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -127,6 +127,7 @@ CFLAGS-test-errno-linux.c += $(no-fortify-source)
 
 sysdep_headers += \
   bits/a.out.h \
+  bits/cloexec.h \
   bits/epoll.h \
   bits/eventfd.h \
   bits/inotify.h \
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h
new file mode 100644
index 0000000000..f381f28a53
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h
@@ -0,0 +1 @@
+#define __O_CLOEXEC 010000000
diff --git a/sysdeps/unix/sysv/linux/bits/cloexec.h b/sysdeps/unix/sysv/linux/bits/cloexec.h
new file mode 100644
index 0000000000..3059fb6473
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/cloexec.h
@@ -0,0 +1 @@
+#define __O_CLOEXEC 02000000
diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
index 628612b885..5b98b47348 100644
--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
@@ -81,9 +81,7 @@
 #ifndef __O_NOFOLLOW
 # define __O_NOFOLLOW	0400000
 #endif
-#ifndef __O_CLOEXEC
-# define __O_CLOEXEC   02000000
-#endif
+#include <bits/cloexec.h>
 #ifndef __O_DIRECT
 # define __O_DIRECT	 040000
 #endif
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h
new file mode 100644
index 0000000000..f381f28a53
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h
@@ -0,0 +1 @@
+#define __O_CLOEXEC 010000000
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h
new file mode 100644
index 0000000000..6706eaa7d5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h
@@ -0,0 +1 @@
+#define __O_CLOEXEC 0x400000
diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h
index e5964b51b1..a12c0b1980 100644
--- a/sysdeps/unix/sysv/linux/sys/mount.h
+++ b/sysdeps/unix/sysv/linux/sys/mount.h
@@ -21,7 +21,6 @@
 #ifndef _SYS_MOUNT_H
 #define _SYS_MOUNT_H	1
 
-#include <fcntl.h>
 #include <features.h>
 #include <stdint.h>
 #include <stddef.h>
@@ -266,6 +265,11 @@ enum fsconfig_command
 
 /* open_tree flags.  */
 #define OPEN_TREE_CLONE    1         /* Clone the target tree and attach the clone */
+#ifndef O_CLOEXEC
+# include <bits/cloexec.h>
+# define O_CLOEXEC __O_CLOEXEC
+#endif
+#undef  OPEN_TREE_CLOEXEC
 #define OPEN_TREE_CLOEXEC  O_CLOEXEC /* Close the file on execve() */
 
 
diff --git a/sysdeps/unix/sysv/linux/tst-mount.c b/sysdeps/unix/sysv/linux/tst-mount.c
index 5eb5548f07..7da0a6fd83 100644
--- a/sysdeps/unix/sysv/linux/tst-mount.c
+++ b/sysdeps/unix/sysv/linux/tst-mount.c
@@ -20,6 +20,7 @@
 #include <support/check.h>
 #include <support/xunistd.h>
 #include <support/namespace.h>
+#include <fcntl.h> /* For AT_ constants.  */
 #include <sys/mount.h>
 
 _Static_assert (sizeof (struct mount_attr) == MOUNT_ATTR_SIZE_VER0,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.