Skip to content

Commit b3cac27

Browse files
serhiy-storchakamiss-islington
authored andcommitted
pythongh-128840: Fix parsing long IPv6 addresses with embedded IPv4 address (pythonGH-134836)
(cherry picked from commit d83576b) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 7515384 commit b3cac27

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

Lib/ipaddress.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,10 +1660,12 @@ def _ip_int_from_string(cls, ip_str):
16601660
"""
16611661
if not ip_str:
16621662
raise AddressValueError('Address cannot be empty')
1663-
if len(ip_str) > 39:
1664-
msg = ("At most 39 characters expected in "
1665-
f"{ip_str[:14]!r}({len(ip_str)-28} chars elided){ip_str[-14:]!r}")
1666-
raise AddressValueError(msg)
1663+
if len(ip_str) > 45:
1664+
shorten = ip_str
1665+
if len(shorten) > 100:
1666+
shorten = f'{ip_str[:45]}({len(ip_str)-90} chars elided){ip_str[-45:]}'
1667+
raise AddressValueError(f"At most 45 characters expected in "
1668+
f"{shorten!r}")
16671669

16681670
# We want to allow more parts than the max to be 'split'
16691671
# to preserve the correct error message when there are

Lib/test/test_ipaddress.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,14 +399,16 @@ def assertBadSplit(addr):
399399

400400
def test_bad_address_split_v6_too_long(self):
401401
def assertBadSplit(addr):
402-
msg = r"At most 39 characters expected in %s"
403-
with self.assertAddressError(msg, repr(re.escape(addr[:14]))):
402+
msg = r"At most 45 characters expected in '%s"
403+
with self.assertAddressError(msg, re.escape(addr[:45])):
404404
ipaddress.IPv6Address(addr)
405405

406406
# Long IPv6 address
407407
long_addr = ("0:" * 10000) + "0"
408408
assertBadSplit(long_addr)
409409
assertBadSplit(long_addr + "%zoneid")
410+
assertBadSplit(long_addr + ":255.255.255.255")
411+
assertBadSplit(long_addr + ":ffff:255.255.255.255")
410412

411413
def test_bad_address_split_v6_too_many_parts(self):
412414
def assertBadSplit(addr):
@@ -2189,6 +2191,11 @@ def testIPv6AddressTooLarge(self):
21892191
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
21902192
ipaddress.ip_address('FFFF::c000:201'))
21912193

2194+
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255'),
2195+
ipaddress.ip_address('::ffff:c0a8:ffff'))
2196+
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255'),
2197+
ipaddress.ip_address('ffff::c0a8:ffff'))
2198+
21922199
self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
21932200
ipaddress.ip_address('::FFFF:c000:201%scope'))
21942201
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
@@ -2201,6 +2208,10 @@ def testIPv6AddressTooLarge(self):
22012208
ipaddress.ip_address('::FFFF:c000:201%scope'))
22022209
self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
22032210
ipaddress.ip_address('FFFF::c000:201%scope'))
2211+
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255%scope'),
2212+
ipaddress.ip_address('::ffff:c0a8:ffff%scope'))
2213+
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255%scope'),
2214+
ipaddress.ip_address('ffff::c0a8:ffff%scope'))
22042215

22052216
def testIPVersion(self):
22062217
self.assertEqual(ipaddress.IPv4Address.version, 4)
@@ -2610,6 +2621,10 @@ def testCompressIPv6Address(self):
26102621
'::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
26112622
'7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
26122623
'0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2624+
'0000:0000:0000:0000:0000:0000:255.255.255.255': '::ffff:ffff/128',
2625+
'0000:0000:0000:0000:0000:ffff:255.255.255.255': '::ffff:255.255.255.255/128',
2626+
'ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255':
2627+
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128',
26132628
}
26142629
for uncompressed, compressed in list(test_addresses.items()):
26152630
self.assertEqual(compressed, str(ipaddress.IPv6Interface(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix parsing long IPv6 addresses with embedded IPv4 address.

0 commit comments

Comments
 (0)