diff --git a/Kernel/FileSystem/File.cpp b/Kernel/FileSystem/File.cpp index cb73de0e34..3d78dd41d6 100644 --- a/Kernel/FileSystem/File.cpp +++ b/Kernel/FileSystem/File.cpp @@ -39,6 +39,7 @@ KResultOr> File::open(int options) { auto description = FileDescription::create(*this); description->set_rw_mode(options); + description->set_file_flags(options); return description; } diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 44805dd5f6..05880480f1 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -277,7 +277,10 @@ KResultOr> VFS::open(StringView path, int options inode.truncate(0); inode.set_mtime(kgettimeofday().tv_sec); } - return FileDescription::create(custody); + auto description = FileDescription::create(custody); + description->set_rw_mode(options); + description->set_file_flags(options); + return description; } KResult VFS::mknod(StringView path, mode_t mode, dev_t dev, Custody& base) @@ -309,8 +312,6 @@ KResult VFS::mknod(StringView path, mode_t mode, dev_t dev, Custody& base) KResultOr> VFS::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional owner) { - (void)options; - if (!is_socket(mode) && !is_fifo(mode) && !is_block_device(mode) && !is_character_device(mode)) { // Turn it into a regular file. (This feels rather hackish.) mode |= 0100000; @@ -332,7 +333,10 @@ KResultOr> VFS::create(StringView path, int optio return KResult(error); auto new_custody = Custody::create(&parent_custody, p.basename(), *new_file, parent_custody.mount_flags()); - return FileDescription::create(*new_custody); + auto description = FileDescription::create(*new_custody); + description->set_rw_mode(options); + description->set_file_flags(options); + return description; } KResult VFS::mkdir(StringView path, mode_t mode, Custody& base) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 8f1aff6106..9f9e7e5199 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1971,14 +1971,6 @@ int Process::sys$open(const Syscall::SC_open_params* user_params) if (result.is_error()) return result.error(); auto description = result.value(); - if (description->file_flags()) { - // We already have file flags set on this description, so - // it must be a preopen description (probably, /proc/pid/fd). - // So don't reset its flags and r/w mode. - } else { - description->set_rw_mode(options); - description->set_file_flags(options); - } u32 fd_flags = (options & O_CLOEXEC) ? FD_CLOEXEC : 0; m_fds[fd].set(move(description), fd_flags); return fd; diff --git a/Kernel/TTY/PTYMultiplexer.cpp b/Kernel/TTY/PTYMultiplexer.cpp index a9cfd01529..bdbadaa4d8 100644 --- a/Kernel/TTY/PTYMultiplexer.cpp +++ b/Kernel/TTY/PTYMultiplexer.cpp @@ -66,6 +66,7 @@ KResultOr> PTYMultiplexer::open(int options) #endif auto description = FileDescription::create(move(master)); description->set_rw_mode(options); + description->set_file_flags(options); return description; }