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)
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
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)