fd-util: do not block O_TMPFILE with -EISDIR (#39736)

This commit is contained in:
Yu Watanabe
2025-11-15 10:01:19 +09:00
committed by GitHub
2 changed files with 5 additions and 4 deletions

View File

@@ -978,7 +978,10 @@ int fd_vet_accmode(int fd, int mode) {
if (flags < 0)
return -errno;
if (FLAGS_SET(flags, O_DIRECTORY))
/* O_TMPFILE in userspace is defined with O_DIRECTORY OR'ed in, so explicitly permit it.
*
* C.f. https://elixir.bootlin.com/linux/v6.17.7/source/include/uapi/asm-generic/fcntl.h#L92 */
if (FLAGS_SET(flags, O_DIRECTORY) && !FLAGS_SET(flags, O_TMPFILE))
return -EISDIR;
if (FLAGS_SET(flags, O_PATH))

View File

@@ -868,10 +868,8 @@ int open_parent_at(int dir_fd, const char *path, int flags, mode_t mode) {
/* Let's insist on O_DIRECTORY since the parent of a file or directory is a directory. Except if we open an
* O_TMPFILE file, because in that case we are actually create a regular file below the parent directory. */
if (FLAGS_SET(flags, O_PATH))
if (!FLAGS_SET(flags, O_TMPFILE))
flags |= O_DIRECTORY;
else if (!FLAGS_SET(flags, O_TMPFILE))
flags |= O_DIRECTORY|O_RDONLY;
return RET_NERRNO(openat(dir_fd, parent, flags, mode));
}