File tree Expand file tree Collapse file tree 2 files changed +22
-4
lines changed Expand file tree Collapse file tree 2 files changed +22
-4
lines changed Original file line number Diff line number Diff line change @@ -1173,6 +1173,11 @@ def _parse_octet(cls, octet_str):
1173
1173
if len (octet_str ) > 3 :
1174
1174
msg = "At most 3 characters permitted in %r"
1175
1175
raise ValueError (msg % octet_str )
1176
+ # Handle leading zeros as strict as glibc's inet_pton()
1177
+ # See security bug bpo-36384
1178
+ if octet_str != '0' and octet_str [0 ] == '0' :
1179
+ msg = "Leading zeros are not permitted in %r"
1180
+ raise ValueError (msg % octet_str )
1176
1181
# Convert to integer (we know digits are legal)
1177
1182
octet_int = int (octet_str , 10 )
1178
1183
if octet_int > 255 :
Original file line number Diff line number Diff line change @@ -97,10 +97,23 @@ def pickle_test(self, addr):
97
97
class CommonTestMixin_v4 (CommonTestMixin ):
98
98
99
99
def test_leading_zeros (self ):
100
- self .assertInstancesEqual ("000.000.000.000" , "0.0.0.0" )
101
- self .assertInstancesEqual ("192.168.000.001" , "192.168.0.1" )
102
- self .assertInstancesEqual ("016.016.016.016" , "16.16.16.16" )
103
- self .assertInstancesEqual ("001.000.008.016" , "1.0.8.16" )
100
+ # bpo-36384: no leading zeros to avoid ambiguity with octal notation
101
+ msg = "Leading zeros are not permitted in '\d+'"
102
+ addresses = [
103
+ "000.000.000.000" ,
104
+ "192.168.000.001" ,
105
+ "016.016.016.016" ,
106
+ "192.168.000.001" ,
107
+ "001.000.008.016" ,
108
+ "01.2.3.40" ,
109
+ "1.02.3.40" ,
110
+ "1.2.03.40" ,
111
+ "1.2.3.040" ,
112
+ ]
113
+ for address in addresses :
114
+ with self .subTest (address = address ):
115
+ with self .assertAddressError (msg ):
116
+ self .factory (address )
104
117
105
118
def test_int (self ):
106
119
self .assertInstancesEqual (0 , "0.0.0.0" )
You can’t perform that action at this time.
0 commit comments