From 0b7395848a7d5133f129e071d975931012bcfb02 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Mon, 10 May 2021 00:28:23 -0700 Subject: [PATCH] Kernel: Plumb OOM propagation through Custody factory Modify the Custody::create(..) API so it has the ability to propagate OOM back to the caller. --- Kernel/FileSystem/Custody.h | 9 +++++++-- Kernel/FileSystem/VirtualFileSystem.cpp | 18 ++++++++++++++---- Kernel/Syscalls/chroot.cpp | 7 ++++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Kernel/FileSystem/Custody.h b/Kernel/FileSystem/Custody.h index 3c18ff692c..2a27c169e7 100644 --- a/Kernel/FileSystem/Custody.h +++ b/Kernel/FileSystem/Custody.h @@ -11,6 +11,7 @@ #include #include #include +#include namespace Kernel { @@ -19,9 +20,13 @@ namespace Kernel { class Custody : public RefCounted { MAKE_SLAB_ALLOCATED(Custody) public: - static NonnullRefPtr create(Custody* parent, const StringView& name, Inode& inode, int mount_flags) + static KResultOr> create(Custody* parent, const StringView& name, Inode& inode, int mount_flags) { - return adopt_ref(*new Custody(parent, name, inode, mount_flags)); + auto custody = new Custody(parent, name, inode, mount_flags); + if (!custody) + return ENOMEM; + + return adopt_ref(*custody); } ~Custody(); diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 646af014fe..c8b2f5d8d1 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -130,6 +130,12 @@ bool VFS::mount_root(FS& file_system) dmesgln("VFS: mounted root from {} ({})", file_system.class_name(), static_cast(file_system).file_description().absolute_path()); m_mounts.append(move(mount)); + + auto root_custody = Custody::create(nullptr, "", *m_root_inode, root_mount_flags); + if (root_custody.is_error()) + return false; + m_root_custody = root_custody.release_value(); + return true; } @@ -381,7 +387,9 @@ KResultOr> VFS::create(StringView path, int optio return inode_or_error.error(); auto new_custody = Custody::create(&parent_custody, p.basename(), inode_or_error.value(), parent_custody.mount_flags()); - auto description = FileDescription::create(*new_custody); + if (new_custody.is_error()) + return new_custody.error(); + auto description = FileDescription::create(*new_custody.release_value()); if (!description.is_error()) { description.value()->set_rw_mode(options); description.value()->set_file_flags(options); @@ -820,8 +828,6 @@ void VFS::sync() Custody& VFS::root_custody() { - if (!m_root_custody) - m_root_custody = Custody::create(nullptr, "", *m_root_inode, root_mount_flags); return *m_root_custody; } @@ -986,7 +992,11 @@ KResultOr> VFS::resolve_path_without_veil(StringView path mount_flags_for_child = mount->flags(); } - custody = Custody::create(&parent, part, *child_inode, mount_flags_for_child); + auto new_custody = Custody::create(&parent, part, *child_inode, mount_flags_for_child); + if (new_custody.is_error()) + return new_custody.error(); + + custody = new_custody.release_value(); if (child_inode->metadata().is_symlink()) { if (!have_more_parts) { diff --git a/Kernel/Syscalls/chroot.cpp b/Kernel/Syscalls/chroot.cpp index 88197dc152..089d98fe25 100644 --- a/Kernel/Syscalls/chroot.cpp +++ b/Kernel/Syscalls/chroot.cpp @@ -25,7 +25,12 @@ KResultOr Process::sys$chroot(Userspace user_path, size_t path auto directory = directory_or_error.value(); m_root_directory_relative_to_global_root = directory; int chroot_mount_flags = mount_flags == -1 ? directory->mount_flags() : mount_flags; - set_root_directory(Custody::create(nullptr, "", directory->inode(), chroot_mount_flags)); + + auto custody = Custody::create(nullptr, "", directory->inode(), chroot_mount_flags); + if (custody.is_error()) + return custody.error(); + + set_root_directory(custody.release_value()); return 0; }