diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index d0688612cd..a04fb34af1 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -162,7 +162,8 @@ ErrorOr LocalSocket::bind(Credentials const& credentials, Userspace LocalSocket::connect(Credentials const& credentials, OpenFileDescription& description, Userspace user_address, socklen_t address_size) { - VERIFY(!m_bound); + if (m_bound) + return set_so_error(EISCONN); if (address_size > sizeof(sockaddr_un)) return set_so_error(EINVAL); diff --git a/Tests/Kernel/TestTCPSocket.cpp b/Tests/Kernel/TestTCPSocket.cpp index 3451033c50..c62d79d32a 100644 --- a/Tests/Kernel/TestTCPSocket.cpp +++ b/Tests/Kernel/TestTCPSocket.cpp @@ -140,3 +140,33 @@ TEST_CASE(tcp_bind_connect) sched_yield(); } } + +TEST_CASE(socket_connect_after_bind) +{ + unlink("/tmp/tmp-client.test"); + unlink("/tmp/tmp.test"); + + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + EXPECT(fd >= 0); + + struct sockaddr_un addr { + .sun_family = AF_UNIX, + .sun_path = "/tmp/tmp-client.test", + }; + + int bound = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); + EXPECT_NE(bound, -1); + + struct sockaddr_un server_sockaddr { + .sun_family = AF_UNIX, + .sun_path = "/tmp/tmp.test", + }; + int connected = connect(fd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)); + EXPECT_EQ(connected, -1); + + int closed = close(fd); + EXPECT_EQ(closed, 0); + + unlink("/tmp/tmp-client.test"); + unlink("/tmp/tmp.test"); +}