From 625ab1f527371692c23efb2e145863bdf8e61ca9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 30 Jan 2020 22:15:45 +0100 Subject: [PATCH] Kernel: LocalSocket should fail with EADDRINUSE for already-bound files --- Kernel/FileSystem/Inode.cpp | 8 ++++++-- Kernel/Net/LocalSocket.cpp | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index 887e533c9c..5b813ecc9e 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -168,14 +168,18 @@ void Inode::set_vmobject(VMObject& vmobject) bool Inode::bind_socket(LocalSocket& socket) { - ASSERT(!m_socket); + LOCKER(m_lock); + if (m_socket) + return false; m_socket = socket; return true; } bool Inode::unbind_socket() { - ASSERT(m_socket); + LOCKER(m_lock); + if (!m_socket) + return false; m_socket = nullptr; return true; } diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 09df3ce43f..68269a82a0 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -117,10 +117,14 @@ KResult LocalSocket::bind(const sockaddr* user_address, socklen_t address_size) return KResult(-EADDRINUSE); return result.error(); } - m_file = move(result.value()); - ASSERT(m_file->inode()); - m_file->inode()->bind_socket(*this); + auto file = move(result.value()); + + ASSERT(file->inode()); + if (!file->inode()->bind_socket(*this)) + return KResult(-EADDRINUSE); + + m_file = move(file); m_address = address; m_bound = true;