8000 [3.13] gh-128840: Fix parsing long IPv6 addresses with embedded IPv4 … · python/cpython@a0287bf · GitHub
[go: up one dir, main page]

Skip to content

Commit a0287bf

Browse files
[3.13] gh-128840: Fix parsing long IPv6 addresses with embedded IPv4 address (GH-134836) (#134846)
gh-128840: Fix parsing long IPv6 addresses with embedded IPv4 address (GH-134836) (cherry picked from commit d83576b) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 5511533 commit a0287bf

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
@@ -1674,10 +1674,12 @@ def _ip_int_from_string(cls, ip_str):
16741674
"""
16751675
if not ip_str:
16761676
raise AddressValueError('Address cannot be empty')
1677-
if len(ip_str) > 39:
1678-
msg = ("At most 39 characters expected in "
1679-
f"{ip_str[:14]!r}({len(ip_str)-28} chars elided){ip_str[-14:]!r}")
1680-
raise AddressValueError(msg)
1677+
if len(ip_str) > 45:
1678+
shorten = ip_str
1679+
if len(shorten) > 100:
1680+
shorten = f'{ip_str[:45]}({len(ip_str)-90} chars elided){ip_str[-45:]}'
1681+
raise AddressValueError(f"At most 45 characters expected in "
1682+
f"{shorten!r}")
16811683

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

Lib/test/test_ipaddress.py

Lines changed: 17 additions & 2 deletions
9331
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(self.ipv4_address.version, 4)
@@ -2604,6 +2615,10 @@ def testCompressIPv6Address(self):
26042615
'::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
26052616
'7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
26062617
'0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2618+
'0000:0000:0000:0000:0000:0000:255.255.255.255': '::ffff:ffff/128',
2619+
'0000:0000:0000:0000:0000:ffff:255.255.255.255': '::ffff:255.255.255.255/128',
2620+
'ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255':
2621+
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128',
26072622
}
26082623
for uncompressed, compressed in list(test_addresses.items()):
26092624
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)
0