From 87bd930e7e13ef945c03cdd2df083e98c9fb4f4d Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Tue, 25 Jan 2022 15:05:29 +0200 Subject: [PATCH] Kernel: Make InodeWatcher inode registration completely OOM-fallible InodeWatcher::register_inode was already partially fallible, but the insertion of the inodes and watch descriptions into their respective hash maps was not. Note that we cannot simply TRY the insertion into both, as that could result in an inconsistent state, instead we must remove the inode from the inode hash map if the insertion into the watch description hash map failed. --- Kernel/FileSystem/InodeWatcher.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Kernel/FileSystem/InodeWatcher.cpp b/Kernel/FileSystem/InodeWatcher.cpp index 61dd040a89..e85dff86fd 100644 --- a/Kernel/FileSystem/InodeWatcher.cpp +++ b/Kernel/FileSystem/InodeWatcher.cpp @@ -123,8 +123,12 @@ ErrorOr InodeWatcher::register_inode(Inode& inode, unsigned event_mask) auto description = TRY(WatchDescription::create(wd, inode, event_mask)); - m_inode_to_watches.set(inode.identifier(), description.ptr()); - m_wd_to_watches.set(wd, move(description)); + TRY(m_inode_to_watches.try_set(inode.identifier(), description.ptr())); + auto result = m_wd_to_watches.try_set(wd, move(description)); + if (result.is_error()) { + m_inode_to_watches.remove(inode.identifier()); + return result.release_error(); + } inode.register_watcher({}, *this); return wd;