From cda56f8049df93a659b228088d2f3d1387558116 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 7 Feb 2022 12:57:57 +0100 Subject: [PATCH] Kernel: Robustify and rename Inode bound socket API Rename the bound socket accessor from socket() to bound_socket(). Also return RefPtr instead of a raw pointer, to make it harder for callers to mess up. --- Kernel/FileSystem/Inode.cpp | 13 +++++++++---- Kernel/FileSystem/Inode.h | 5 ++--- Kernel/Net/LocalSocket.cpp | 5 +++-- Kernel/Syscalls/open.cpp | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index 1b8a606c9e..a8822a1e23 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -136,21 +136,26 @@ void Inode::set_shared_vmobject(Memory::SharedInodeVMObject& vmobject) m_shared_vmobject = vmobject; } +RefPtr Inode::bound_socket() const +{ + return m_bound_socket; +} + bool Inode::bind_socket(LocalSocket& socket) { MutexLocker locker(m_inode_lock); - if (m_socket) + if (m_bound_socket) return false; - m_socket = socket; + m_bound_socket = socket; return true; } bool Inode::unbind_socket() { MutexLocker locker(m_inode_lock); - if (!m_socket) + if (!m_bound_socket) return false; - m_socket = nullptr; + m_bound_socket = nullptr; return true; } diff --git a/Kernel/FileSystem/Inode.h b/Kernel/FileSystem/Inode.h index 775e4ad020..7351e892e2 100644 --- a/Kernel/FileSystem/Inode.h +++ b/Kernel/FileSystem/Inode.h @@ -66,8 +66,7 @@ public: virtual ErrorOr get_block_address(int) { return ENOTSUP; } - LocalSocket* socket() { return m_socket.ptr(); } - const LocalSocket* socket() const { return m_socket.ptr(); } + RefPtr bound_socket() const; bool bind_socket(LocalSocket&); bool unbind_socket(); @@ -117,7 +116,7 @@ private: FileSystem& m_file_system; InodeIndex m_index { 0 }; WeakPtr m_shared_vmobject; - RefPtr m_socket; + RefPtr m_bound_socket; SpinlockProtected> m_watchers; bool m_metadata_dirty { false }; RefPtr m_fifo; diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 14b84ae98c..de46196624 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -174,7 +174,9 @@ ErrorOr LocalSocket::connect(OpenFileDescription& description, Userspacesocket()) + + auto peer = inode->bound_socket(); + if (!peer) return set_so_error(ECONNREFUSED); m_path = move(path); @@ -182,7 +184,6 @@ ErrorOr LocalSocket::connect(OpenFileDescription& description, Userspaceinode()->socket(); auto result = peer->queue_connection_from(*this); if (result.is_error()) { set_connect_side_role(Role::None); diff --git a/Kernel/Syscalls/open.cpp b/Kernel/Syscalls/open.cpp index 8943ad8086..34b1754d3b 100644 --- a/Kernel/Syscalls/open.cpp +++ b/Kernel/Syscalls/open.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace Kernel { @@ -56,7 +57,7 @@ ErrorOr Process::sys$open(Userspace use auto description = TRY(VirtualFileSystem::the().open(path->view(), options, mode & ~umask(), *base)); - if (description->inode() && description->inode()->socket()) + if (description->inode() && description->inode()->bound_socket()) return ENXIO; return m_fds.with_exclusive([&](auto& fds) -> ErrorOr {