From 12ab0dcee01bb3c3ace9924ef6f2c407f46f16b5 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Tue, 11 May 2021 03:55:20 -0700 Subject: [PATCH] Kernel: Make FileDescription::create() APIs OOM safe --- Kernel/FileSystem/FileDescription.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Kernel/FileSystem/FileDescription.cpp b/Kernel/FileSystem/FileDescription.cpp index 8af6efb8a0..5d14f6f6dc 100644 --- a/Kernel/FileSystem/FileDescription.cpp +++ b/Kernel/FileSystem/FileDescription.cpp @@ -27,25 +27,34 @@ namespace Kernel { KResultOr> FileDescription::create(Custody& custody) { - auto description = adopt_ref(*new FileDescription(InodeFile::create(custody.inode()))); + auto inode_file = InodeFile::create(custody.inode()); + if (inode_file.is_error()) + return inode_file.error(); + + auto description = adopt_ref_if_nonnull(new FileDescription(*inode_file.release_value())); + if (!description) + return ENOMEM; + description->m_custody = custody; auto result = description->attach(); if (result.is_error()) { dbgln_if(FILEDESCRIPTION_DEBUG, "Failed to create file description for custody: {}", result); return result; } - return description; + return description.release_nonnull(); } KResultOr> FileDescription::create(File& file) { - auto description = adopt_ref(*new FileDescription(file)); + auto description = adopt_ref_if_nonnull(new FileDescription(file)); + if (!description) + return ENOMEM; auto result = description->attach(); if (result.is_error()) { dbgln_if(FILEDESCRIPTION_DEBUG, "Failed to create file description for file: {}", result); return result; } - return description; + return description.release_nonnull(); } FileDescription::FileDescription(File& file)