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
This commit is contained in:
gVisor bot
2023-11-28 08:01:18 -08:00
parent 94c0d777ab
commit 60d6f0b291
+33
View File
@@ -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<const sockaddr_in*>(&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<const sockaddr_in6*>(&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;