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;