@@ -198,6 +198,41 @@ def testBytecodeCompilation(self):
198
198
# TODO: why doesn't comparing the cstructs work?
199
199
self .assertEquals (diag_msg .Pack (), sockets [0 ][0 ].Pack ())
200
200
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
+
201
236
@unittest .skipUnless (HAVE_SOCK_DESTROY , "SOCK_DESTROY not supported" )
202
237
def testClosesSockets (self ):
203
238
self .socketpairs = self ._CreateLotsOfSockets ()
0 commit comments