diff --git a/kernel/src/sys/open.cpp b/kernel/src/sys/open.cpp index 3a57f3ea..9453e574 100644 --- a/kernel/src/sys/open.cpp +++ b/kernel/src/sys/open.cpp @@ -23,11 +23,6 @@ Result sys_openat(Registers*, SyscallArgs args) // Caller did not pass either O_RDONLY, O_WRONLY or O_RDWR if ((flags & O_RDWR) == 0) { return err(EINVAL); } - if (flags & O_DIRECTORY) - { - if ((flags & O_WRONLY) || (flags & O_CREAT)) return err(EINVAL); - } - if (flags & O_TMPFILE) { if (!(flags & O_WRONLY)) return err(EINVAL); @@ -66,6 +61,11 @@ Result sys_openat(Registers*, SyscallArgs args) if (inode->type() != VFS::InodeType::Directory && (flags & O_DIRECTORY)) return err(ENOTDIR); + if (inode->type() == VFS::InodeType::Directory) + { + if ((flags & O_WRONLY) || (flags & O_CREAT)) return err(EISDIR); + } + if ((flags & O_WRONLY) && (flags & O_TRUNC)) inode->truncate(0); int fd = TRY(current->allocate_fd(0));