diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index b92200ea6d..4a6a8a001b 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -37,13 +37,12 @@ UNMAP_AFTER_INIT ProcFSComponentRegistry::ProcFSComponentRegistry() { } -RefPtr ProcFS::create() +KResultOr> ProcFS::try_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFS); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFS()); } ProcFS::ProcFS() - : m_root_inode(ProcFSComponentRegistry::the().root_directory().to_inode(*this)) { } @@ -53,6 +52,11 @@ ProcFS::~ProcFS() KResult ProcFS::initialize() { + auto root_inode = ProcFSComponentRegistry::the().root_directory().to_inode(*this); + if (root_inode.is_error()) + return root_inode.error(); + m_root_inode = static_cast>(root_inode.release_value()); + return KSuccess; } @@ -104,9 +108,9 @@ KResult ProcFSInode::truncate(u64) return EPERM; } -NonnullRefPtr ProcFSGlobalInode::create(const ProcFS& fs, const ProcFSExposedComponent& component) +KResultOr> ProcFSGlobalInode::try_create(const ProcFS& fs, const ProcFSExposedComponent& component) { - return adopt_ref(*new (nothrow) ProcFSGlobalInode(fs, component)); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSGlobalInode(fs, component)); } ProcFSGlobalInode::ProcFSGlobalInode(const ProcFS& fs, const ProcFSExposedComponent& component) @@ -169,9 +173,9 @@ KResultOr ProcFSGlobalInode::write_bytes(off_t offset, size_t count, con return m_associated_component->write_bytes(offset, count, buffer, fd); } -NonnullRefPtr ProcFSDirectoryInode::create(const ProcFS& procfs, const ProcFSExposedComponent& component) +KResultOr> ProcFSDirectoryInode::try_create(const ProcFS& procfs, const ProcFSExposedComponent& component) { - return adopt_ref(*new (nothrow) ProcFSDirectoryInode(procfs, component)); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSDirectoryInode(procfs, component)); } ProcFSDirectoryInode::ProcFSDirectoryInode(const ProcFS& fs, const ProcFSExposedComponent& component) @@ -203,15 +207,21 @@ KResult ProcFSDirectoryInode::traverse_as_directory(Function> ProcFSDirectoryInode::lookup(StringView name) { MutexLocker locker(procfs().m_lock); - auto component = m_associated_component->lookup(name); - if (!component) - return ENOMEM; - return component->to_inode(procfs()); + auto maybe_component = m_associated_component->lookup(name); + if (maybe_component.is_error()) + return maybe_component.error(); + + auto component = maybe_component.release_value(); + auto maybe_inode = component->to_inode(procfs()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + + return maybe_inode.release_value(); } -NonnullRefPtr ProcFSLinkInode::create(const ProcFS& procfs, const ProcFSExposedComponent& component) +KResultOr> ProcFSLinkInode::try_create(const ProcFS& procfs, const ProcFSExposedComponent& component) { - return adopt_ref(*new (nothrow) ProcFSLinkInode(procfs, component)); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSLinkInode(procfs, component)); } ProcFSLinkInode::ProcFSLinkInode(const ProcFS& fs, const ProcFSExposedComponent& component) @@ -243,9 +253,9 @@ KResultOr ProcFSProcessAssociatedInode::write_bytes(off_t, size_t, const VERIFY_NOT_REACHED(); } -NonnullRefPtr ProcFSProcessDirectoryInode::create(const ProcFS& procfs, ProcessID pid) +KResultOr> ProcFSProcessDirectoryInode::try_create(const ProcFS& procfs, ProcessID pid) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessDirectoryInode(procfs, pid)).release_nonnull(); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessDirectoryInode(procfs, pid)); } ProcFSProcessDirectoryInode::ProcFSProcessDirectoryInode(const ProcFS& procfs, ProcessID pid) @@ -294,32 +304,73 @@ KResultOr> ProcFSProcessDirectoryInode::lookup(StringView n auto process = Process::from_pid(associated_pid()); if (!process) return ESRCH; - if (name == "fd") - return ProcFSProcessSubDirectoryInode::create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()); - if (name == "stacks") - return ProcFSProcessSubDirectoryInode::create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()); - if (name == "unveil") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Unveil, associated_pid()); - if (name == "pledge") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid()); - if (name == "fds") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions, associated_pid()); - if (name == "exe") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid()); - if (name == "cwd") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink, associated_pid()); - if (name == "perf_events") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents, associated_pid()); - if (name == "vm") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid()); - if (name == "root") - return ProcFSProcessPropertyInode::create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::RootLink, associated_pid()); + if (name == "fd") { + auto maybe_inode = ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "stacks") { + auto maybe_inode = ProcFSProcessSubDirectoryInode::try_create(procfs(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "unveil") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Unveil, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "pledge") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::Pledge, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "fds") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "exe") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "cwd") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "perf_events") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "vm") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + if (name == "root") { + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_pid_property(procfs(), SegmentedProcFSIndex::MainProcessProperty::RootLink, associated_pid()); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + return ENOENT; } -NonnullRefPtr ProcFSProcessSubDirectoryInode::create(const ProcFS& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) +KResultOr> ProcFSProcessSubDirectoryInode::try_create(const ProcFS& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessSubDirectoryInode(procfs, sub_directory_type, pid)).release_nonnull(); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessSubDirectoryInode(procfs, sub_directory_type, pid)); } ProcFSProcessSubDirectoryInode::ProcFSProcessSubDirectoryInode(const ProcFS& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) @@ -384,12 +435,18 @@ KResultOr> ProcFSProcessSubDirectoryInode::lookup(StringVie return ESRCH; RefPtr inode; switch (m_sub_directory_type) { - case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions: - inode = process->lookup_file_descriptions_directory(procfs(), name); - break; - case SegmentedProcFSIndex::ProcessSubDirectory::Stacks: - inode = process->lookup_stacks_directory(procfs(), name); - break; + case SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions: { + auto maybe_inode = process->lookup_file_descriptions_directory(procfs(), name); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } + case SegmentedProcFSIndex::ProcessSubDirectory::Stacks: { + auto maybe_inode = process->lookup_stacks_directory(procfs(), name); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); + } default: VERIFY_NOT_REACHED(); } @@ -398,17 +455,17 @@ KResultOr> ProcFSProcessSubDirectoryInode::lookup(StringVie return inode.release_nonnull(); } -NonnullRefPtr ProcFSProcessPropertyInode::create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid) +KResultOr> ProcFSProcessPropertyInode::try_create_for_file_description_link(const ProcFS& procfs, unsigned file_description_index, ProcessID pid) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessPropertyInode(procfs, file_description_index, pid)).release_nonnull(); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, file_description_index, pid)); } -NonnullRefPtr ProcFSProcessPropertyInode::create_for_thread_stack(const ProcFS& procfs, ThreadID stack_thread_index, ProcessID pid) +KResultOr> ProcFSProcessPropertyInode::try_create_for_thread_stack(const ProcFS& procfs, ThreadID stack_thread_index, ProcessID pid) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessPropertyInode(procfs, stack_thread_index, pid)).release_nonnull(); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, stack_thread_index, pid)); } -NonnullRefPtr ProcFSProcessPropertyInode::create_for_pid_property(const ProcFS& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) +KResultOr> ProcFSProcessPropertyInode::try_create_for_pid_property(const ProcFS& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessPropertyInode(procfs, main_property_type, pid)).release_nonnull(); + return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, main_property_type, pid)); } ProcFSProcessPropertyInode::ProcFSProcessPropertyInode(const ProcFS& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) diff --git a/Kernel/FileSystem/ProcFS.h b/Kernel/FileSystem/ProcFS.h index 1aaa2b1512..d5676f8c2d 100644 --- a/Kernel/FileSystem/ProcFS.h +++ b/Kernel/FileSystem/ProcFS.h @@ -28,7 +28,7 @@ class ProcFS final : public FileSystem { public: virtual ~ProcFS() override; - static RefPtr create(); + static KResultOr> try_create(); virtual KResult initialize() override; virtual StringView class_name() const override { return "ProcFS"sv; } @@ -38,7 +38,7 @@ public: private: ProcFS(); - NonnullRefPtr m_root_inode; + RefPtr m_root_inode; }; class ProcFSInode : public Inode { @@ -69,7 +69,7 @@ class ProcFSGlobalInode : public ProcFSInode { friend class ProcFS; public: - static NonnullRefPtr create(const ProcFS&, const ProcFSExposedComponent&); + static KResultOr> try_create(const ProcFS&, const ProcFSExposedComponent&); virtual ~ProcFSGlobalInode() override {}; StringView name() const; @@ -92,7 +92,7 @@ class ProcFSLinkInode : public ProcFSGlobalInode { friend class ProcFS; public: - static NonnullRefPtr create(const ProcFS&, const ProcFSExposedComponent&); + static KResultOr> try_create(const ProcFS&, const ProcFSExposedComponent&); protected: ProcFSLinkInode(const ProcFS&, const ProcFSExposedComponent&); @@ -103,7 +103,7 @@ class ProcFSDirectoryInode final : public ProcFSGlobalInode { friend class ProcFS; public: - static NonnullRefPtr create(const ProcFS&, const ProcFSExposedComponent&); + static KResultOr> try_create(const ProcFS&, const ProcFSExposedComponent&); virtual ~ProcFSDirectoryInode() override; protected: @@ -132,7 +132,7 @@ class ProcFSProcessDirectoryInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: - static NonnullRefPtr create(const ProcFS&, ProcessID); + static KResultOr> try_create(const ProcFS&, ProcessID); private: ProcFSProcessDirectoryInode(const ProcFS&, ProcessID); @@ -149,7 +149,7 @@ class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode friend class ProcFS; public: - static NonnullRefPtr create(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); + static KResultOr> try_create(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); private: ProcFSProcessSubDirectoryInode(const ProcFS&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); @@ -168,9 +168,9 @@ class ProcFSProcessPropertyInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: - static NonnullRefPtr create_for_file_description_link(const ProcFS&, unsigned, ProcessID); - static NonnullRefPtr create_for_thread_stack(const ProcFS&, ThreadID, ProcessID); - static NonnullRefPtr create_for_pid_property(const ProcFS&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); + static KResultOr> try_create_for_file_description_link(const ProcFS&, unsigned, ProcessID); + static KResultOr> try_create_for_thread_stack(const ProcFS&, ThreadID, ProcessID); + static KResultOr> try_create_for_pid_property(const ProcFS&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); private: ProcFSProcessPropertyInode(const ProcFS&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index 0b79420e17..be755db284 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -926,17 +926,27 @@ KResult ProcFSRootDirectory::traverse_as_directory(unsigned fsid, Function ProcFSRootDirectory::lookup(StringView name) +KResultOr> ProcFSRootDirectory::lookup(StringView name) { - if (auto candidate = ProcFSExposedDirectory::lookup(name); !candidate.is_null()) - return candidate; + auto maybe_candidate = ProcFSExposedDirectory::lookup(name); + if (maybe_candidate.is_error()) { + if (maybe_candidate.error() != ENOENT) { + return maybe_candidate.error(); + } + } else { + return maybe_candidate.release_value(); + } String process_directory_name = name; auto pid = process_directory_name.to_uint(); if (!pid.has_value()) - return {}; + return ESRCH; auto actual_pid = pid.value(); - return Process::from_pid(actual_pid); + + auto maybe_process = Process::from_pid(actual_pid); + if (maybe_process) + return maybe_process.release_nonnull(); + return ENOENT; } UNMAP_AFTER_INIT ProcFSRootDirectory::ProcFSRootDirectory() diff --git a/Kernel/Process.h b/Kernel/Process.h index 266651f5c2..a9a0e0953a 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -551,7 +551,7 @@ private: public: // ^ProcFSExposedComponent stats virtual InodeIndex component_index() const override; - virtual NonnullRefPtr to_inode(const ProcFS& procfs_instance) const override; + virtual KResultOr> to_inode(const ProcFS& procfs_instance) const override; virtual KResult traverse_as_directory(unsigned, Function) const override; virtual mode_t required_mode() const override { return 0555; } virtual uid_t owner_user() const override { return uid(); } @@ -567,10 +567,10 @@ public: mode_t binary_link_required_mode() const; KResultOr procfs_get_thread_stack(ThreadID thread_id, KBufferBuilder& builder) const; KResult traverse_stacks_directory(unsigned fsid, Function callback) const; - RefPtr lookup_stacks_directory(const ProcFS&, StringView name) const; + KResultOr> lookup_stacks_directory(const ProcFS&, StringView name) const; KResultOr procfs_get_file_description_link(unsigned fd, KBufferBuilder& builder) const; KResult traverse_file_descriptions_directory(unsigned fsid, Function callback) const; - RefPtr lookup_file_descriptions_directory(const ProcFS&, StringView name) const; + KResultOr> lookup_file_descriptions_directory(const ProcFS&, StringView name) const; private: inline PerformanceEventBuffer* current_perf_events_buffer() diff --git a/Kernel/ProcessExposed.cpp b/Kernel/ProcessExposed.cpp index ecf85dbc8a..fe40cc926e 100644 --- a/Kernel/ProcessExposed.cpp +++ b/Kernel/ProcessExposed.cpp @@ -170,19 +170,31 @@ KResultOr ProcFSExposedLink::read_bytes(off_t offset, size_t count, User return nread; } -NonnullRefPtr ProcFSExposedLink::to_inode(const ProcFS& procfs_instance) const +KResultOr> ProcFSExposedLink::to_inode(const ProcFS& procfs_instance) const { - return ProcFSLinkInode::create(procfs_instance, *this); + auto maybe_inode = ProcFSLinkInode::try_create(procfs_instance, *this); + if (maybe_inode.is_error()) + return maybe_inode.error(); + + return maybe_inode.release_value(); } -NonnullRefPtr ProcFSExposedComponent::to_inode(const ProcFS& procfs_instance) const +KResultOr> ProcFSExposedComponent::to_inode(const ProcFS& procfs_instance) const { - return ProcFSGlobalInode::create(procfs_instance, *this); + auto maybe_inode = ProcFSGlobalInode::try_create(procfs_instance, *this); + if (maybe_inode.is_error()) + return maybe_inode.error(); + + return maybe_inode.release_value(); } -NonnullRefPtr ProcFSExposedDirectory::to_inode(const ProcFS& procfs_instance) const +KResultOr> ProcFSExposedDirectory::to_inode(const ProcFS& procfs_instance) const { - return ProcFSDirectoryInode::create(procfs_instance, *this); + auto maybe_inode = ProcFSDirectoryInode::try_create(procfs_instance, *this); + if (maybe_inode.is_error()) + return maybe_inode.error(); + + return maybe_inode.release_value(); } void ProcFSExposedDirectory::add_component(const ProcFSExposedComponent&) @@ -190,14 +202,14 @@ void ProcFSExposedDirectory::add_component(const ProcFSExposedComponent&) TODO(); } -RefPtr ProcFSExposedDirectory::lookup(StringView name) +KResultOr> ProcFSExposedDirectory::lookup(StringView name) { for (auto& component : m_components) { if (component.name() == name) { return component; } } - return {}; + return ENOENT; } KResult ProcFSExposedDirectory::traverse_as_directory(unsigned fsid, Function callback) const diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index 85afd01425..5c8b6aba19 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -69,7 +69,7 @@ public: StringView name() const { return m_name->view(); } virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer&, FileDescription*) const { VERIFY_NOT_REACHED(); } virtual KResult traverse_as_directory(unsigned, Function) const { VERIFY_NOT_REACHED(); } - virtual RefPtr lookup(StringView) { VERIFY_NOT_REACHED(); }; + virtual KResultOr> lookup(StringView) { VERIFY_NOT_REACHED(); }; virtual KResultOr write_bytes(off_t, size_t, const UserOrKernelBuffer&, FileDescription*) { return KResult(EROFS); } virtual size_t size() const { return 0; } @@ -84,7 +84,7 @@ public: return KSuccess; } - virtual NonnullRefPtr to_inode(const ProcFS& procfs_instance) const; + virtual KResultOr> to_inode(const ProcFS& procfs_instance) const; virtual InodeIndex component_index() const { return m_component_index; } @@ -106,7 +106,7 @@ class ProcFSExposedDirectory public: virtual KResult traverse_as_directory(unsigned, Function) const override; - virtual RefPtr lookup(StringView name) override; + virtual KResultOr> lookup(StringView name) override; void add_component(const ProcFSExposedComponent&); virtual void prepare_for_deletion() override @@ -117,7 +117,7 @@ public: } virtual mode_t required_mode() const override { return 0555; } - virtual NonnullRefPtr to_inode(const ProcFS& procfs_instance) const override final; + virtual KResultOr> to_inode(const ProcFS& procfs_instance) const override final; protected: explicit ProcFSExposedDirectory(StringView name); @@ -128,7 +128,7 @@ protected: class ProcFSExposedLink : public ProcFSExposedComponent { public: - virtual NonnullRefPtr to_inode(const ProcFS& procfs_instance) const override final; + virtual KResultOr> to_inode(const ProcFS& procfs_instance) const override final; virtual KResultOr read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const override; @@ -142,7 +142,7 @@ class ProcFSRootDirectory final : public ProcFSExposedDirectory { friend class ProcFSComponentRegistry; public: - virtual RefPtr lookup(StringView name) override; + virtual KResultOr> lookup(StringView name) override; static NonnullRefPtr must_create(); virtual ~ProcFSRootDirectory(); diff --git a/Kernel/ProcessSpecificExposed.cpp b/Kernel/ProcessSpecificExposed.cpp index 6e53a85f1c..00689f867e 100644 --- a/Kernel/ProcessSpecificExposed.cpp +++ b/Kernel/ProcessSpecificExposed.cpp @@ -45,9 +45,12 @@ InodeIndex Process::component_index() const return SegmentedProcFSIndex::build_segmented_index_for_pid_directory(pid()); } -NonnullRefPtr Process::to_inode(const ProcFS& procfs_instance) const +KResultOr> Process::to_inode(const ProcFS& procfs_instance) const { - return ProcFSProcessDirectoryInode::create(procfs_instance, m_protected_values.pid); + auto maybe_inode = ProcFSProcessDirectoryInode::try_create(procfs_instance, m_protected_values.pid); + if (maybe_inode.is_error()) + return maybe_inode.error(); + return maybe_inode.release_value(); } KResult Process::traverse_as_directory(unsigned fsid, Function callback) const @@ -80,18 +83,28 @@ KResult Process::traverse_stacks_directory(unsigned fsid, Function Process::lookup_stacks_directory(const ProcFS& procfs, StringView name) const +KResultOr> Process::lookup_stacks_directory(const ProcFS& procfs, StringView name) const { - RefPtr thread_stack_inode; + KResultOr> thread_stack_inode { ENOENT }; + // FIXME: Try to exit the loop earlier for_each_thread([&](const Thread& thread) { int tid = thread.tid().value(); VERIFY(!(tid < 0)); if (name == String::number(tid)) { - thread_stack_inode = ProcFSProcessPropertyInode::create_for_thread_stack(procfs, thread.tid(), pid()); + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_thread_stack(procfs, thread.tid(), pid()); + if (maybe_inode.is_error()) { + thread_stack_inode = maybe_inode.error(); + return; + } + + thread_stack_inode = maybe_inode.release_value(); } }); - return thread_stack_inode; + + if (thread_stack_inode.is_error()) + return thread_stack_inode.error(); + return thread_stack_inode.release_value(); } KResultOr Process::procfs_get_file_description_link(unsigned fd, KBufferBuilder& builder) const @@ -121,9 +134,9 @@ KResult Process::traverse_file_descriptions_directory(unsigned fsid, Function Process::lookup_file_descriptions_directory(const ProcFS& procfs, StringView name) const +KResultOr> Process::lookup_file_descriptions_directory(const ProcFS& procfs, StringView name) const { - RefPtr file_description_link; + KResultOr> file_description_link { ENOENT }; // FIXME: Try to exit the loop earlier size_t count = 0; fds().enumerate([&](auto& file_description_metadata) { @@ -132,11 +145,20 @@ RefPtr Process::lookup_file_descriptions_directory(const ProcFS& procfs, return; } if (name == String::number(count)) { - file_description_link = ProcFSProcessPropertyInode::create_for_file_description_link(procfs, static_cast(count), pid()); + auto maybe_inode = ProcFSProcessPropertyInode::try_create_for_file_description_link(procfs, static_cast(count), pid()); + if (maybe_inode.is_error()) { + file_description_link = maybe_inode.error(); + return; + } + + file_description_link = maybe_inode.release_value(); } count++; }); - return file_description_link; + + if (file_description_link.is_error()) + return file_description_link.error(); + return file_description_link.release_value(); } KResult Process::procfs_get_pledge_stats(KBufferBuilder& builder) const diff --git a/Kernel/Syscalls/mount.cpp b/Kernel/Syscalls/mount.cpp index f8a6d8f30b..757c117c1c 100644 --- a/Kernel/Syscalls/mount.cpp +++ b/Kernel/Syscalls/mount.cpp @@ -90,7 +90,10 @@ KResultOr Process::sys$mount(Userspace fs = Plan9FS::create(*description); } else if (fs_type == "proc"sv || fs_type == "ProcFS"sv) { - fs = ProcFS::create(); + auto maybe_fs = ProcFS::try_create(); + if (maybe_fs.is_error()) + return maybe_fs.error(); + fs = maybe_fs.release_value(); } else if (fs_type == "devpts"sv || fs_type == "DevPtsFS"sv) { fs = DevPtsFS::create(); } else if (fs_type == "dev"sv || fs_type == "DevFS"sv) {