mirror of
https://github.com/python/cpython.git
synced 2025-07-07 11:25:30 +00:00
gh-128840: Fix parsing long IPv6 addresses with embedded IPv4 address (#134836)
This commit is contained in:
parent
91618278e7
commit
d83576bf48
3 changed files with 24 additions and 6 deletions
|
@ -1660,10 +1660,12 @@ class _BaseV6:
|
|||
"""
|
||||
if not ip_str:
|
||||
raise AddressValueError('Address cannot be empty')
|
||||
if len(ip_str) > 39:
|
||||
msg = ("At most 39 characters expected in "
|
||||
f"{ip_str[:14]!r}({len(ip_str)-28} chars elided){ip_str[-14:]!r}")
|
||||
raise AddressValueError(msg)
|
||||
if len(ip_str) > 45:
|
||||
shorten = ip_str
|
||||
if len(shorten) > 100:
|
||||
shorten = f'{ip_str[:45]}({len(ip_str)-90} chars elided){ip_str[-45:]}'
|
||||
raise AddressValueError(f"At most 45 characters expected in "
|
||||
f"{shorten!r}")
|
||||
|
||||
# We want to allow more parts than the max to be 'split'
|
||||
# to preserve the correct error message when there are
|
||||
|
|
|
@ -399,14 +399,16 @@ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
|
|||
|
||||
def test_bad_address_split_v6_too_long(self):
|
||||
def assertBadSplit(addr):
|
||||
msg = r"At most 39 characters expected in %s"
|
||||
with self.assertAddressError(msg, repr(re.escape(addr[:14]))):
|
||||
msg = r"At most 45 characters expected in '%s"
|
||||
with self.assertAddressError(msg, re.escape(addr[:45])):
|
||||
ipaddress.IPv6Address(addr)
|
||||
|
||||
# Long IPv6 address
|
||||
long_addr = ("0:" * 10000) + "0"
|
||||
assertBadSplit(long_addr)
|
||||
assertBadSplit(long_addr + "%zoneid")
|
||||
assertBadSplit(long_addr + ":255.255.255.255")
|
||||
assertBadSplit(long_addr + ":ffff:255.255.255.255")
|
||||
|
||||
def test_bad_address_split_v6_too_many_parts(self):
|
||||
def assertBadSplit(addr):
|
||||
|
@ -2189,6 +2191,11 @@ class IpaddrUnitTest(unittest.TestCase):
|
|||
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
|
||||
ipaddress.ip_address('FFFF::c000:201'))
|
||||
|
||||
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255'),
|
||||
ipaddress.ip_address('::ffff:c0a8:ffff'))
|
||||
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255'),
|
||||
ipaddress.ip_address('ffff::c0a8:ffff'))
|
||||
|
||||
self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
|
||||
ipaddress.ip_address('::FFFF:c000:201%scope'))
|
||||
self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
|
||||
|
@ -2201,6 +2208,10 @@ class IpaddrUnitTest(unittest.TestCase):
|
|||
ipaddress.ip_address('::FFFF:c000:201%scope'))
|
||||
self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
|
||||
ipaddress.ip_address('FFFF::c000:201%scope'))
|
||||
self.assertEqual(ipaddress.ip_address('0000:0000:0000:0000:0000:FFFF:192.168.255.255%scope'),
|
||||
ipaddress.ip_address('::ffff:c0a8:ffff%scope'))
|
||||
self.assertEqual(ipaddress.ip_address('FFFF:0000:0000:0000:0000:0000:192.168.255.255%scope'),
|
||||
ipaddress.ip_address('ffff::c0a8:ffff%scope'))
|
||||
|
||||
def testIPVersion(self):
|
||||
self.assertEqual(ipaddress.IPv4Address.version, 4)
|
||||
|
@ -2610,6 +2621,10 @@ class IpaddrUnitTest(unittest.TestCase):
|
|||
'::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
|
||||
'7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
|
||||
'0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
|
||||
'0000:0000:0000:0000:0000:0000:255.255.255.255': '::ffff:ffff/128',
|
||||
'0000:0000:0000:0000:0000:ffff:255.255.255.255': '::ffff:255.255.255.255/128',
|
||||
'ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255':
|
||||
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128',
|
||||
}
|
||||
for uncompressed, compressed in list(test_addresses.items()):
|
||||
self.assertEqual(compressed, str(ipaddress.IPv6Interface(
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix parsing long IPv6 addresses with embedded IPv4 address.
|
Loading…
Add table
Add a link
Reference in a new issue