aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/ipaddress.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/ipaddress.py')
-rw-r--r--Lib/ipaddress.py11
1 files changed, 9 insertions, 2 deletions
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
index d8a84f33264..69e933a6541 100644
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -1660,8 +1660,16 @@ 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)
- parts = ip_str.split(':')
+ # We want to allow more parts than the max to be 'split'
+ # to preserve the correct error message when there are
+ # too many parts combined with '::'
+ _max_parts = cls._HEXTET_COUNT + 1
+ parts = ip_str.split(':', maxsplit=_max_parts)
# An IPv6 address needs at least 2 colons (3 parts).
_min_parts = 3
@@ -1681,7 +1689,6 @@ class _BaseV6:
# An IPv6 address can't have more than 8 colons (9 parts).
# The extra colon comes from using the "::" notation for a single
# leading or trailing zero part.
- _max_parts = cls._HEXTET_COUNT + 1
if len(parts) > _max_parts:
msg = "At most %d colons permitted in %r" % (_max_parts-1, ip_str)
raise AddressValueError(msg)