From 558c63a6f9c7b68d66f0cab9c166925996155d1a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 25 Oct 2019 09:22:22 +0200 Subject: [PATCH] Kernel: FileDescription::is_directory() should not assert !is_fifo() I have no idea why this was here. It makes no sense. If you're trying to find out if something is a directory, why wouldn't you be allowed to ask that about a FIFO? :^) Thanks to Brandon for spotting this! Also, while we're here, cache the directory state in a bool member so we don't have to keep fetching inode metadata when checking this repeatedly. This is important since sys$read() now calls it. --- Kernel/FileSystem/FileDescription.cpp | 11 ++++------- Kernel/FileSystem/FileDescription.h | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Kernel/FileSystem/FileDescription.cpp b/Kernel/FileSystem/FileDescription.cpp index defb5e6338..f68112d770 100644 --- a/Kernel/FileSystem/FileDescription.cpp +++ b/Kernel/FileSystem/FileDescription.cpp @@ -34,6 +34,7 @@ FileDescription::FileDescription(File& file) m_inode = static_cast(file).inode(); if (is_socket()) socket()->attach(*this); + m_is_directory = metadata().is_directory(); } FileDescription::~FileDescription() @@ -138,19 +139,15 @@ ByteBuffer FileDescription::read_entire_file() return m_inode->read_entire(this); } -bool FileDescription::is_directory() const -{ - ASSERT(!is_fifo()); - return metadata().is_directory(); -} ssize_t FileDescription::get_dir_entries(u8* buffer, ssize_t size) { + if (!is_directory()) + return -ENOTDIR; + auto metadata = this->metadata(); if (!metadata.is_valid()) return -EIO; - if (!metadata.is_directory()) - return -ENOTDIR; int size_to_allocate = max(PAGE_SIZE, metadata.size); diff --git a/Kernel/FileSystem/FileDescription.h b/Kernel/FileSystem/FileDescription.h index 62dcb91b7f..dc2fedd26c 100644 --- a/Kernel/FileSystem/FileDescription.h +++ b/Kernel/FileSystem/FileDescription.h @@ -44,7 +44,7 @@ public: String absolute_path() const; - bool is_directory() const; + bool is_directory() const { return m_is_directory; } File& file() { return *m_file; } const File& file() const { return *m_file; } @@ -115,6 +115,7 @@ private: u32 m_file_flags { 0 }; bool m_is_blocking { true }; + bool m_is_directory { false }; bool m_should_append { false }; FIFO::Direction m_fifo_direction { FIFO::Direction::Neither }; };