diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index 0b3a3fd28f..f4b5ac032a 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -159,8 +159,11 @@ public: virtual uid_t owner_user() const override { return m_associated_process->uid(); } virtual gid_t owner_group() const override { return m_associated_process->gid(); } + virtual KResult refresh_data(FileDescription&) const override; + virtual RefPtr lookup(StringView name) override; private: + void on_attach(); IntrusiveListNode> m_list_node; explicit ProcFSProcessFolder(const Process&); diff --git a/Kernel/ProcessSpecificExposed.cpp b/Kernel/ProcessSpecificExposed.cpp index f711769edb..c4c9fdff47 100644 --- a/Kernel/ProcessSpecificExposed.cpp +++ b/Kernel/ProcessSpecificExposed.cpp @@ -509,19 +509,40 @@ private: WeakPtr m_parent_process_directory; }; +void ProcFSProcessFolder::on_attach() +{ + VERIFY(m_components.size() == 0); + m_components.append(ProcFSProcessUnveil::create(*this)); + m_components.append(ProcFSProcessPerformanceEvents::create(*this)); + m_components.append(ProcFSProcessFileDescriptions::create(*this)); + m_components.append(ProcFSProcessOverallFileDescriptions::create(*this)); + m_components.append(ProcFSProcessRoot::create(*this)); + m_components.append(ProcFSProcessVirtualMemory::create(*this)); + m_components.append(ProcFSProcessCurrentWorkDirectory::create(*this)); + m_components.append(ProcFSProcessBinary::create(*this)); + m_components.append(ProcFSProcessStacks::create(*this)); +} + +RefPtr ProcFSProcessFolder::lookup(StringView name) +{ + // Note: we need to allocate all sub components when doing a lookup, because + // for some reason, the caller may not call ProcFSInode::attach method before calling this. + if (m_components.size() == 0) + on_attach(); + return ProcFSExposedFolder::lookup(name); +} + +KResult ProcFSProcessFolder::refresh_data(FileDescription&) const +{ + if (m_components.size() != 0) + return KSuccess; + const_cast(*this).on_attach(); + return KSuccess; +} + NonnullRefPtr ProcFSProcessFolder::create(const Process& process) { - auto folder = adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull(); - folder->m_components.append(ProcFSProcessUnveil::create(folder)); - folder->m_components.append(ProcFSProcessPerformanceEvents::create(folder)); - folder->m_components.append(ProcFSProcessFileDescriptions::create(folder)); - folder->m_components.append(ProcFSProcessOverallFileDescriptions::create(folder)); - folder->m_components.append(ProcFSProcessRoot::create(folder)); - folder->m_components.append(ProcFSProcessVirtualMemory::create(folder)); - folder->m_components.append(ProcFSProcessCurrentWorkDirectory::create(folder)); - folder->m_components.append(ProcFSProcessBinary::create(folder)); - folder->m_components.append(ProcFSProcessStacks::create(folder)); - return folder; + return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull(); } ProcFSProcessFolder::ProcFSProcessFolder(const Process& process)