From 7a74c8319b67b80c7d102a82b5bd7f4dd876495d Mon Sep 17 00:00:00 2001 From: Nayana Bidari Date: Tue, 20 Jun 2023 14:54:56 -0700 Subject: [PATCH] Return error while calling shutdown on a bound unconnected UDP socket. PiperOrigin-RevId: 542057418 --- pkg/tcpip/transport/udp/endpoint.go | 3 +++ test/syscalls/linux/socket_inet_loopback.cc | 3 ++- test/syscalls/linux/udp_socket.cc | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/tcpip/transport/udp/endpoint.go b/pkg/tcpip/transport/udp/endpoint.go index 02f304efa..a9948a1c6 100644 --- a/pkg/tcpip/transport/udp/endpoint.go +++ b/pkg/tcpip/transport/udp/endpoint.go @@ -745,6 +745,9 @@ func (e *endpoint) Shutdown(flags tcpip.ShutdownFlags) tcpip.Error { } } + if e.net.State() == transport.DatagramEndpointStateBound { + return &tcpip.ErrNotConnected{} + } return nil } diff --git a/test/syscalls/linux/socket_inet_loopback.cc b/test/syscalls/linux/socket_inet_loopback.cc index 68a16d84b..f43fe615a 100644 --- a/test/syscalls/linux/socket_inet_loopback.cc +++ b/test/syscalls/linux/socket_inet_loopback.cc @@ -1572,7 +1572,8 @@ TEST_P(SocketInetReusePortTest, UdpPortReuseMultiThread) { // Shutdown all sockets to wake up other threads. for (int j = 0; j < kThreadCount; j++) - shutdown(listener_fds[j].get(), SHUT_RD); + EXPECT_THAT(shutdown(listener_fds[j].get(), SHUT_RD), + SyscallFailsWithErrno(ENOTCONN)); }); } diff --git a/test/syscalls/linux/udp_socket.cc b/test/syscalls/linux/udp_socket.cc index db44ec4ff..be30807e0 100644 --- a/test/syscalls/linux/udp_socket.cc +++ b/test/syscalls/linux/udp_socket.cc @@ -2432,6 +2432,21 @@ TEST_P(UdpSocketTest, SendPacketLargerThanSendBufOnNonBlockingSocket) { SyscallFailsWithErrno(EAGAIN))); } +TEST_P(UdpSocketTest, ReadShutdownOnBoundSocket) { + ASSERT_NO_ERRNO(BindLoopback()); + + // Bind `sock_` to loopback. + struct sockaddr_storage addr_storage = InetLoopbackAddr(); + struct sockaddr* addr = AsSockAddr(&addr_storage); + ASSERT_NO_ERRNO(BindSocket(sock_.get(), addr)); + + int shut_opts[] = {SHUT_RD, SHUT_WR, SHUT_RDWR}; + for (int shut_opt : shut_opts) { + EXPECT_THAT(shutdown(sock_.get(), shut_opt), + SyscallFailsWithErrno(ENOTCONN)); + } +} + INSTANTIATE_TEST_SUITE_P(AllInetTests, UdpSocketControlMessagesTest, ::testing::Values(AddressFamily::kIpv4, AddressFamily::kIpv6,