mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
fd-util: do not block O_TMPFILE with -EISDIR (#39736)
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user