From 60d6f0b29116355d1c70ac15b96d0216ee2871cc Mon Sep 17 00:00:00 2001 From: gVisor bot Date: Tue, 28 Nov 2023 07:58:52 -0800 Subject: [PATCH] Add a syscall test exercising getsockname on unbound TCP sockets Verify that getsockname on a TCP socket that is not bound or connected still succeeds. PiperOrigin-RevId: 585977990 --- test/syscalls/linux/tcp_socket.cc | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/syscalls/linux/tcp_socket.cc b/test/syscalls/linux/tcp_socket.cc index 2bce47300..bf613fb9b 100644 --- a/test/syscalls/linux/tcp_socket.cc +++ b/test/syscalls/linux/tcp_socket.cc @@ -1019,6 +1019,39 @@ TEST_P(SimpleTcpSocketTest, GetPeerNameUnconnected) { SyscallFailsWithErrno(ENOTCONN)); } +TEST_P(SimpleTcpSocketTest, GetSockNameUnbound) { + int fd; + ASSERT_THAT(fd = socket(GetParam(), SOCK_STREAM, IPPROTO_TCP), + SyscallSucceeds()); + FileDescriptor sock_fd(fd); + + sockaddr_storage addr; + // Ensure that any 0s we read later have been explicitly set by getsockname. + memset(&addr, -1, sizeof(addr)); + socklen_t addrlen = sizeof(addr); + EXPECT_THAT(getsockname(fd, AsSockAddr(&addr), &addrlen), SyscallSucceeds()); + switch (GetParam()) { + case AF_INET: { + ASSERT_EQ(addrlen, sizeof(sockaddr_in)); + auto sock_addr_in = reinterpret_cast(&addr); + ASSERT_EQ(sock_addr_in->sin_addr.s_addr, 0); + ASSERT_EQ(sock_addr_in->sin_port, 0); + break; + } + case AF_INET6: { + ASSERT_EQ(addrlen, sizeof(sockaddr_in6)); + auto sock_addr_in6 = reinterpret_cast(&addr); + ASSERT_TRUE(IN6_IS_ADDR_UNSPECIFIED(&sock_addr_in6->sin6_addr)); + ASSERT_EQ(sock_addr_in6->sin6_port, 0); + break; + } + default: { + ADD_FAILURE() << "unreachable"; + break; + } + } +} + TEST_P(TcpSocketTest, FullBuffer) { // Set both FDs to be blocking. int flags = 0;