From 8c52800156e22d1a3d06e9f873b68b16ae4035c6 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 13 Nov 2023 04:49:21 -0800 Subject: [PATCH] Add a syscall test exercising dualstack address family mismatches Verify that the connect call returns the proper errno when asked to connect to a remote IP in a different address family than the local IP. PiperOrigin-RevId: 581919473 --- test/syscalls/linux/socket_inet_loopback.cc | 37 +++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/syscalls/linux/socket_inet_loopback.cc b/test/syscalls/linux/socket_inet_loopback.cc index 8dde3eeea..bb646ed04 100644 --- a/test/syscalls/linux/socket_inet_loopback.cc +++ b/test/syscalls/linux/socket_inet_loopback.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -218,6 +219,42 @@ INSTANTIATE_TEST_SUITE_P( return s; }); +using DualStackAfMismatchTest = ::testing::TestWithParam; + +TEST_P(DualStackAfMismatchTest, V6ListenerV4Connect) { + ProtocolTestParam const& param = GetParam(); + const FileDescriptor socket_fd = + ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_INET6, param.type, 0)); + + const TestAddress& v6_addr = V6Loopback(); + const TestAddress& v4_addr = V4MappedLoopback(); + ASSERT_THAT( + bind(socket_fd.get(), AsSockAddr(&v6_addr.addr), v6_addr.addr_len), + SyscallSucceeds()); + ASSERT_THAT( + connect(socket_fd.get(), AsSockAddr(&v4_addr.addr), v4_addr.addr_len), + SyscallFailsWithErrno(ENETUNREACH)); +} + +TEST_P(DualStackAfMismatchTest, V4ListenerV6Connect) { + // Gvisor does not return the correct Errno. + SKIP_IF(IsRunningOnGvisor()); + const FileDescriptor socket_fd = + ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)); + + const TestAddress& v6_addr = V6Loopback(); + const TestAddress& v4_addr = V4MappedLoopback(); + ASSERT_THAT( + bind(socket_fd.get(), AsSockAddr(&v4_addr.addr), v4_addr.addr_len), + SyscallSucceeds()); + ASSERT_THAT( + connect(socket_fd.get(), AsSockAddr(&v6_addr.addr), v6_addr.addr_len), + SyscallFailsWithErrno(EAFNOSUPPORT)); +} + +INSTANTIATE_TEST_SUITE_P(All, DualStackAfMismatchTest, ProtocolTestValues(), + DescribeProtocolTestParam); + void tcpSimpleConnectTest(TestAddress const& listener, TestAddress const& connector, bool unbound) { // Create the listening socket.