@@ -10,9 +10,11 @@ def patched_getaddrinfo(*args, **kwargs):
1010 # flag AI_CANONNAME, even if `host` is an IP
1111 rv = []
1212 result = socket .getaddrinfo (* args , ** kwargs )
13+ first = True
1314 for af , sk , proto , canon_name , addr in result :
1415 if kwargs .get ('flags' , 0 ) & socket .AI_CANONNAME :
15- if not canon_name :
16+ if not canon_name and first :
17+ first = False
1618 canon_name = args [0 ]
1719 if not isinstance (canon_name , str ):
1820 canon_name = canon_name .decode ('ascii' )
@@ -24,20 +26,20 @@ def patched_getaddrinfo(*args, **kwargs):
2426
2527class BaseTestDNS :
2628
27- def _test_getaddrinfo (self , * args , _patch = False , ** kwargs ):
29+ def _test_getaddrinfo (self , * args , _patch = False , _sorted = False , ** kwargs ):
2830 err = None
2931 try :
3032 if _patch :
3133 a1 = patched_getaddrinfo (* args , ** kwargs )
3234 else :
3335 a1 = socket .getaddrinfo (* args , ** kwargs )
34- except socket .gaierror as ex :
36+ except ( socket .gaierror , UnicodeError ) as ex :
3537 err = ex
3638
3739 try :
3840 a2 = self .loop .run_until_complete (
3941 self .loop .getaddrinfo (* args , ** kwargs ))
40- except socket .gaierror as ex :
42+ except ( socket .gaierror , UnicodeError ) as ex :
4143 if err is not None :
4244 self .assertEqual (ex .args , err .args )
4345 else :
@@ -50,7 +52,17 @@ def _test_getaddrinfo(self, *args, _patch=False, **kwargs):
5052 if err is not None :
5153 raise err
5254
53- self .assertEqual (a1 , a2 )
55+ if _sorted :
56+ if kwargs .get ('flags' , 0 ) & socket .AI_CANONNAME and a1 and a2 :
57+ af , sk , proto , canon_name1 , addr = a1 [0 ]
58+ a1 [0 ] = (af , sk , proto , '' , addr )
59+ af , sk , proto , canon_name2 , addr = a2 [0 ]
60+ a2 [0 ] = (af , sk , proto , '' , addr )
61+ self .assertEqual (canon_name1 , canon_name2 )
62+
63+ self .assertEqual (sorted (a1 ), sorted (a2 ))
64+ else :
65+ self .assertEqual (a1 , a2 )
5466
5567 def _test_getnameinfo (self , * args , ** kwargs ):
5668 err = None
@@ -77,11 +89,13 @@ def _test_getnameinfo(self, *args, **kwargs):
7789 self .assertEqual (a1 , a2 )
7890
7991 def test_getaddrinfo_1 (self ):
80- self ._test_getaddrinfo ('example.com' , 80 )
81- self ._test_getaddrinfo ('example.com' , 80 , type = socket .SOCK_STREAM )
92+ self ._test_getaddrinfo ('example.com' , 80 , _sorted = True )
93+ self ._test_getaddrinfo ('example.com' , 80 , type = socket .SOCK_STREAM ,
94+ _sorted = True )
8295
8396 def test_getaddrinfo_2 (self ):
84- self ._test_getaddrinfo ('example.com' , 80 , flags = socket .AI_CANONNAME )
97+ self ._test_getaddrinfo ('example.com' , 80 , flags = socket .AI_CANONNAME ,
98+ _sorted = True )
8599
86100 def test_getaddrinfo_3 (self ):
87101 self ._test_getaddrinfo ('a' + '1' * 50 + '.wat' , 800 )
@@ -92,12 +106,14 @@ def test_getaddrinfo_4(self):
92106 family = - 1 )
93107
94108 def test_getaddrinfo_5 (self ):
95- self ._test_getaddrinfo ('example.com' , '80' )
96- self ._test_getaddrinfo ('example.com' , '80' , type = socket .SOCK_STREAM )
109+ self ._test_getaddrinfo ('example.com' , '80' , _sorted = True )
110+ self ._test_getaddrinfo ('example.com' , '80' , type = socket .SOCK_STREAM ,
111+ _sorted = True )
97112
98113 def test_getaddrinfo_6 (self ):
99- self ._test_getaddrinfo (b'example.com' , b'80' )
100- self ._test_getaddrinfo (b'example.com' , b'80' , type = socket .SOCK_STREAM )
114+ self ._test_getaddrinfo (b'example.com' , b'80' , _sorted = True )
115+ self ._test_getaddrinfo (b'example.com' , b'80' , type = socket .SOCK_STREAM ,
116+ _sorted = True )
101117
102118 def test_getaddrinfo_7 (self ):
103119 self ._test_getaddrinfo (None , 0 )
@@ -116,8 +132,9 @@ def test_getaddrinfo_10(self):
116132 self ._test_getaddrinfo (None , None , type = socket .SOCK_STREAM )
117133
118134 def test_getaddrinfo_11 (self ):
119- self ._test_getaddrinfo (b'example.com' , '80' )
120- self ._test_getaddrinfo (b'example.com' , '80' , type = socket .SOCK_STREAM )
135+ self ._test_getaddrinfo (b'example.com' , '80' , _sorted = True )
136+ self ._test_getaddrinfo (b'example.com' , '80' , type = socket .SOCK_STREAM ,
137+ _sorted = True )
121138
122139 def test_getaddrinfo_12 (self ):
123140 # musl always returns ai_canonname but we don't
@@ -187,6 +204,18 @@ def test_getaddrinfo_20(self):
187204 self ._test_getaddrinfo ('127.0.0.1' , 80 , type = socket .SOCK_STREAM ,
188205 flags = socket .AI_CANONNAME , _patch = patch )
189206
207+ # https://github.com/libuv/libuv/security/advisories/GHSA-f74f-cvh7-c6q6
208+ # See also: https://github.com/MagicStack/uvloop/pull/600
209+ def test_getaddrinfo_21 (self ):
210+ payload = f'0x{ "0" * 246 } 7f000001.example.com' .encode ('ascii' )
211+ self ._test_getaddrinfo (payload , 80 )
212+ self ._test_getaddrinfo (payload , 80 , type = socket .SOCK_STREAM )
213+
214+ def test_getaddrinfo_22 (self ):
215+ payload = f'0x{ "0" * 246 } 7f000001.example.com'
216+ self ._test_getaddrinfo (payload , 80 )
217+ self ._test_getaddrinfo (payload , 80 , type = socket .SOCK_STREAM )
218+
190219 ######
191220
192221 def test_getnameinfo_1 (self ):
0 commit comments