Thread (2 messages) 2 messages, 2 authors, 2025-05-30

Re: [PATCH] man/man2/open.2: Fix doc for O_CREAT | O_DIRECTORY

From: Alejandro Colomar <alx@kernel.org>
Date: 2025-05-30 08:19:25

Hi Paul,

On Fri, May 30, 2025 at 12:20:19AM -0700, Paul Eggert wrote:
Although Linux kernels before 5.7 would create a regular file when
opening a nonexistent file with O_CREAT | O_DIRECTORY, this behavior
was changed to something deeply buggy in 5.7, and when the bug was
fixed in 6.4 this combination of open flags became invalid.

Adjust the documentation to match the 6.4+ behavior,
which makes more sense anyway.

Signed-off-by: Paul Eggert <redacted>
Thanks!  I have verified this with the following program:

	alx@devuan:~/tmp$ cat open.c 
	#include <fcntl.h>
	#include <stdio.h>

	int
	main(void)
	{
		if (open("/home/alx/tmp/nonexistent",
			 O_WRONLY | O_CREAT | O_DIRECTORY, 0644) == -1)
		{
			perror("open");
		}
	}
	alx@devuan:~/tmp$ gcc -Wall -Wextra open.c 
	alx@devuan:~/tmp$ ./a.out 
	open: Invalid argument

I've applied the patch.
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=4dc50bb57870012426c7e5a44eb573bec3dc4cac>


Have a lovely day!
Alex
quoted hunk ↗ jump to hunk
---
 man/man2/open.2 | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/man/man2/open.2 b/man/man2/open.2
index 948dcd62e..c47b2ad58 100644
--- a/man/man2/open.2
+++ b/man/man2/open.2
@@ -1068,6 +1068,16 @@ was specified.
 .TP
 .B EINVAL
 .B O_CREAT
+and
+.B O_DIRECTORY
+were both specified in
+.I flags ,
+and the Linux kernel version is 6.4 or later.
+(Earlier kernels were inconsistent in this area,
+and POSIX does not specify the behavior.)
+.TP
+.B EINVAL
+.B O_CREAT
 was specified in
 .I flags
 and the final component ("basename") of the new file's
@@ -1882,20 +1892,6 @@ and
 when trying to determine whether the kernel supports
 .B O_TMPFILE
 functionality.
-.P
-When both
-.B O_CREAT
-and
-.B O_DIRECTORY
-are specified in
-.I flags
-and the file specified by
-.I path
-does not exist,
-.BR open ()
-will create a regular file (i.e.,
-.B O_DIRECTORY
-is ignored).
 .SH SEE ALSO
 .BR chmod (2),
 .BR chown (2),
-- 
2.49.0
-- 
<https://www.alejandro-colomar.es/>

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help