def testCrossFamilyBytecode(self):
        """Checks for a cross-family bug in inet_diag_hostcond matching.

    Relevant kernel commits:
      android-3.4:
        f67caec inet_diag: avoid unsafe and nonsensical prefix matches in inet_diag_bc_run()
    """
        # TODO: this is only here because the test fails if there are any open
        # sockets other than the ones it creates itself. Make the bytecode more
        # specific and remove it.
        states = 1 << tcp_test.TCP_ESTABLISHED
        self.assertFalse(
            self.sock_diag.DumpAllInetSockets(IPPROTO_TCP, "", states=states))

        unused_pair4 = net_test.CreateSocketPair(AF_INET, SOCK_STREAM,
                                                 "127.0.0.1")
        unused_pair6 = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM, "::1")

        bytecode4 = self.sock_diag.PackBytecode([
            (sock_diag.INET_DIAG_BC_S_COND, 1, 2, ("0.0.0.0", 0, -1))
        ])
        bytecode6 = self.sock_diag.PackBytecode([
            (sock_diag.INET_DIAG_BC_S_COND, 1, 2, ("::", 0, -1))
        ])

        # IPv4/v6 filters must never match IPv6/IPv4 sockets...
        v4socks = self.sock_diag.DumpAllInetSockets(IPPROTO_TCP,
                                                    bytecode4,
                                                    states=states)
        self.assertTrue(v4socks)
        self.assertTrue(all(d.family == AF_INET for d, _ in v4socks))

        v6socks = self.sock_diag.DumpAllInetSockets(IPPROTO_TCP,
                                                    bytecode6,
                                                    states=states)
        self.assertTrue(v6socks)
        self.assertTrue(all(d.family == AF_INET6 for d, _ in v6socks))

        # Except for mapped addresses, which match both IPv4 and IPv6.
        pair5 = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM,
                                          "::ffff:127.0.0.1")
        diag_msgs = [self.sock_diag.FindSockDiagFromFd(s) for s in pair5]
        v4socks = [
            d for d, _ in self.sock_diag.DumpAllInetSockets(
                IPPROTO_TCP, bytecode4, states=states)
        ]
        v6socks = [
            d for d, _ in self.sock_diag.DumpAllInetSockets(
                IPPROTO_TCP, bytecode6, states=states)
        ]
        self.assertTrue(all(d in v4socks for d in diag_msgs))
        self.assertTrue(all(d in v6socks for d in diag_msgs))
    def testMarkBytecode(self):
        family, addr = random.choice([(AF_INET, "127.0.0.1"),
                                      (AF_INET6, "::1"),
                                      (AF_INET6, "::ffff:127.0.0.1")])
        s1, s2 = net_test.CreateSocketPair(family, SOCK_STREAM, addr)
        s1.setsockopt(SOL_SOCKET, net_test.SO_MARK, 0xfff1234)
        s2.setsockopt(SOL_SOCKET, net_test.SO_MARK, 0xf0f1235)

        infos = self.FilterEstablishedSockets(0x1234, 0xffff)
        self.assertFoundSockets(infos, [s1])

        infos = self.FilterEstablishedSockets(0x1234, 0xfffe)
        self.assertFoundSockets(infos, [s1, s2])

        infos = self.FilterEstablishedSockets(0x1235, 0xffff)
        self.assertFoundSockets(infos, [s2])

        infos = self.FilterEstablishedSockets(0x0, 0x0)
        self.assertFoundSockets(infos, [s1, s2])

        infos = self.FilterEstablishedSockets(0xfff0000, 0xf0fed00)
        self.assertEquals(0, len(infos))

        with net_test.RunAsUid(12345):
            self.assertRaisesErrno(EPERM, self.FilterEstablishedSockets,
                                   0xfff0000, 0xf0fed00)
 def testFindsMappedSockets(self):
     """Tests that inet_diag_find_one_icsk can find mapped sockets."""
     socketpair = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM,
                                            "::ffff:127.0.0.1")
     for sock in socketpair:
         diag_msg = self.sock_diag.FindSockDiagFromFd(sock)
         diag_req = self.sock_diag.DiagReqFromDiagMsg(diag_msg, IPPROTO_TCP)
         self.sock_diag.GetSockInfo(diag_req)
示例#4
0
 def CheckSocketCookie(self, inet, addr):
     """Tests that getsockopt SO_COOKIE can get cookie for all sockets."""
     socketpair = net_test.CreateSocketPair(inet, SOCK_STREAM, addr)
     for sock in socketpair:
         diag_msg = self.sock_diag.FindSockDiagFromFd(sock)
         cookie = sock.getsockopt(net_test.SOL_SOCKET, net_test.SO_COOKIE,
                                  8)
         self.assertEqual(diag_msg.id.cookie, cookie)
 def _CreateLotsOfSockets(socktype):
     # Dict mapping (addr, sport, dport) tuples to socketpairs.
     socketpairs = {}
     for _ in xrange(NUM_SOCKETS):
         family, addr = random.choice([(AF_INET, "127.0.0.1"),
                                       (AF_INET6, "::1"),
                                       (AF_INET6, "::ffff:127.0.0.1")])
         socketpair = net_test.CreateSocketPair(family, socktype, addr)
         sport, dport = (socketpair[0].getsockname()[1],
                         socketpair[1].getsockname()[1])
         socketpairs[(addr, sport, dport)] = socketpair
     return socketpairs
示例#6
0
  def testFindsMappedSockets(self):
    """Tests that inet_diag_find_one_icsk can find mapped sockets.

    Relevant kernel commits:
      android-3.10:
        f77e059 net: diag: support v4mapped sockets in inet_diag_find_one_icsk()
    """
    socketpair = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM,
                                           "::ffff:127.0.0.1")
    for sock in socketpair:
      diag_msg = self.sock_diag.FindSockDiagFromFd(sock)
      diag_req = self.sock_diag.DiagReqFromDiagMsg(diag_msg, IPPROTO_TCP)
      self.sock_diag.GetSockDiag(diag_req)
def CreateIPv6SocketPair():
    return net_test.CreateSocketPair(AF_INET6, SOCK_STREAM, IPV6_LOOPBACK_ADDR)