Skip to content

Commit 0d9dd0d

Browse files
committed
Test for a cross-family bytecode comparison bug.
Change-Id: I251088dc09d803a7448930cd155fc3a1c6c5bddf
1 parent 9d77f94 commit 0d9dd0d

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

tests/net_test/sock_diag_test.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,41 @@ def testBytecodeCompilation(self):
198198
# TODO: why doesn't comparing the cstructs work?
199199
self.assertEquals(diag_msg.Pack(), sockets[0][0].Pack())
200200

201+
def testCrossFamilyBytecode(self):
202+
"""Checks for a cross-family bug in inet_diag_hostcond matching.
203+
204+
Relevant kernel commits:
205+
android-3.4:
206+
f67caec inet_diag: avoid unsafe and nonsensical prefix matches in inet_diag_bc_run()
207+
"""
208+
pair4 = net_test.CreateSocketPair(AF_INET, SOCK_STREAM, "127.0.0.1")
209+
pair6 = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM, "::1")
210+
211+
bytecode4 = self.sock_diag.PackBytecode([
212+
(sock_diag.INET_DIAG_BC_S_COND, 1, 2, ("0.0.0.0", 0, -1))])
213+
bytecode6 = self.sock_diag.PackBytecode([
214+
(sock_diag.INET_DIAG_BC_S_COND, 1, 2, ("::", 0, -1))])
215+
216+
# IPv4/v6 filters must never match IPv6/IPv4 sockets...
217+
v4sockets = self.sock_diag.DumpAllInetSockets(IPPROTO_TCP, bytecode4)
218+
self.assertTrue(v4sockets)
219+
self.assertTrue(all(d.family == AF_INET for d, _ in v4sockets))
220+
221+
v6sockets = self.sock_diag.DumpAllInetSockets(IPPROTO_TCP, bytecode6)
222+
self.assertTrue(v6sockets)
223+
self.assertTrue(all(d.family == AF_INET6 for d, _ in v6sockets))
224+
225+
# Except for mapped addresses, which match both IPv4 and IPv6.
226+
pair5 = net_test.CreateSocketPair(AF_INET6, SOCK_STREAM,
227+
"::ffff:127.0.0.1")
228+
diag_msgs = [self.sock_diag.FindSockDiagFromFd(s) for s in pair5]
229+
v4sockets = [d for d, _ in self.sock_diag.DumpAllInetSockets(IPPROTO_TCP,
230+
bytecode4)]
231+
v6sockets = [d for d, _ in self.sock_diag.DumpAllInetSockets(IPPROTO_TCP,
232+
bytecode6)]
233+
self.assertTrue(all(d in v4sockets for d in diag_msgs))
234+
self.assertTrue(all(d in v6sockets for d in diag_msgs))
235+
201236
@unittest.skipUnless(HAVE_SOCK_DESTROY, "SOCK_DESTROY not supported")
202237
def testClosesSockets(self):
203238
self.socketpairs = self._CreateLotsOfSockets()

0 commit comments

Comments
 (0)