Skip to content

Commit 427311c

Browse files
serhiy-storchakamiss-islington
authored andcommitted
gh-128840: Fix parsing long IPv6 addresses with embedded IPv4 address (GH-134836)
(cherry picked from commit d83576b) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent d4cf1fa commit 427311c

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
@@ -1664,10 +1664,12 @@ def _ip_int_from_string(cls, ip_str):
16641664
"""
16651665
if not ip_str:
16661666
raise AddressValueError('Address cannot be empty')
1667-
if len(ip_str) > 39:
1668-
msg = ("At most 39 characters expected in "
1669-
f"{ip_str[:14]!r}({len(ip_str)-28} chars elided){ip_str[-14:]!r}")
1670-
raise AddressValueError(msg)
1667+
if len(ip_str) > 45:
1668+
shorten = ip_str
1669+
if len(shorten) > 100:
1670+
shorten = f'{ip_str[:45]}({len(ip_str)-90} chars elided){ip_str[-45:]}'
1671+
raise AddressValueError(f"At most 45 characters expected in "
1672+
f"{shorten!r}")
16711673

16721674
# We want to allow more parts than the max to be 'split'
16731675
# 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
@@ -391,14 +391,16 @@ def assertBadSplit(addr):
391391

392392
def test_bad_address_split_v6_too_long(self):
393393
def assertBadSplit(addr):
394-
msg = r"At most 39 characters expected in %s"
395-
with self.assertAddressError(msg, repr(re.escape(addr[:14]))):
394+
msg = r"At most 45 characters expected in '%s"
395+
with self.assertAddressError(msg, re.escape(addr[:45])):
396396
ipaddress.IPv6Address(addr)
397397

398398
# Long IPv6 address
399399
long_addr = ("0:" * 10000) + "0"
400400
assertBadSplit(long_addr)
401401
assertBadSplit(long_addr + "%zoneid")
402+
assertBadSplit(long_addr + ":255.255.255.255")
403+
assertBadSplit(long_addr + ":ffff:255.255.255.255")
402404

403405
def test_bad_address_split_v6_too_many_parts(self):
404406
def assertBadSplit(addr):
@@ -2170,6 +2172,11 @@ def testIPv6AddressTooLarge(self):
21702172
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
21712173
ipaddress.ip_address('FFFF::c000:201'))
21722174

2175+
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255'),
2176+
ipaddress.ip_address('::ffff:c0a8:ffff'))
2177+
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255'),
2178+
ipaddress.ip_address('ffff::c0a8:ffff'))
2179+
21732180
self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
21742181
ipaddress.ip_address('::FFFF:c000:201%scope'))
21752182
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
@@ -2182,6 +2189,10 @@ def testIPv6AddressTooLarge(self):
21822189
ipaddress.ip_address('::FFFF:c000:201%scope'))
21832190
self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
21842191
ipaddress.ip_address('FFFF::c000:201%scope'))
2192+
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255%scope'),
2193+
ipaddress.ip_address('::ffff:c0a8:ffff%scope'))
2194+
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255%scope'),
2195+
ipaddress.ip_address('ffff::c0a8:ffff%scope'))
21852196

21862197
def testIPVersion(self):
21872198
self.assertEqual(self.ipv4_address.version, 4)
@@ -2585,6 +2596,10 @@ def testCompressIPv6Address(self):
25852596
'::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
25862597
'7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
25872598
'0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2599+
'0000:0000:0000:0000:0000:0000:255.255.255.255': '::ffff:ffff/128',
2600+
'0000:0000:0000:0000:0000:ffff:255.255.255.255': '::ffff:255.255.255.255/128',
2601+
'ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255':
2602+
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128',
25882603
}
25892604
for uncompressed, compressed in list(test_addresses.items()):
25902605
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)