https://github.com/python/cpython/commit/76a1c5d18312712baed4699fe7333abb050ec9b7
commit: 76a1c5d18312712baed4699fe7333abb050ec9b7
branch: main
author: Seth Michael Larson <[email protected]>
committer: gpshead <[email protected]>
date: 2024-09-07T11:05:58-07:00
summary:
gh-122792: Make IPv4-mapped IPv6 address properties consistent with IPv4
(GH-122793)
Make IPv4-mapped IPv6 address properties consistent with IPv4.
files:
A Misc/NEWS.d/next/Security/2024-08-07-10-42-13.gh-issue-122792.oiTMo9.rst
M Lib/ipaddress.py
M Lib/test/test_ipaddress.py
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
index c5a737d76de245..cb41c522883d74 100644
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -2029,6 +2029,9 @@ def is_multicast(self):
See RFC 2373 2.7 for details.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_multicast
return self in self._constants._multicast_network
@property
@@ -2040,6 +2043,9 @@ def is_reserved(self):
reserved IPv6 Network ranges.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_reserved
return any(self in x for x in self._constants._reserved_networks)
@property
@@ -2050,6 +2056,9 @@ def is_link_local(self):
A boolean, True if the address is reserved per RFC 4291.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_link_local
return self in self._constants._linklocal_network
@property
@@ -2106,6 +2115,9 @@ def is_global(self):
``is_global`` has value opposite to :attr:`is_private`, except for the
``100.64.0.0/10``
IPv4 range where they are both ``False``.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_global
return not self.is_private
@property
@@ -2117,6 +2129,9 @@ def is_unspecified(self):
RFC 2373 2.5.2.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_unspecified
return self._ip == 0
@property
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
index 7364d6fc7202c4..aad779dd9b25e7 100644
--- a/Lib/test/test_ipaddress.py
+++ b/Lib/test/test_ipaddress.py
@@ -2446,6 +2446,30 @@ def testIpv4Mapped(self):
self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
ipaddress.ip_address('192.168.1.1'))
+ def testIpv4MappedProperties(self):
+ # Test that an IPv4 mapped IPv6 address has
+ # the same properties as an IPv4 address.
+ for addr4 in (
+ "178.62.3.251", # global
+ "169.254.169.254", # link local
+ "127.0.0.1", # loopback
+ "224.0.0.1", # multicast
+ "192.168.0.1", # private
+ "0.0.0.0", # unspecified
+ "100.64.0.1", # public and not global
+ ):
+ with self.subTest(addr4):
+ ipv4 = ipaddress.IPv4Address(addr4)
+ ipv6 = ipaddress.IPv6Address(f"::ffff:{addr4}")
+
+ self.assertEqual(ipv4.is_global, ipv6.is_global)
+ self.assertEqual(ipv4.is_private, ipv6.is_private)
+ self.assertEqual(ipv4.is_reserved, ipv6.is_reserved)
+ self.assertEqual(ipv4.is_multicast, ipv6.is_multicast)
+ self.assertEqual(ipv4.is_unspecified, ipv6.is_unspecified)
+ self.assertEqual(ipv4.is_link_local, ipv6.is_link_local)
+ self.assertEqual(ipv4.is_loopback, ipv6.is_loopback)
+
def testIpv4MappedPrivateCheck(self):
self.assertEqual(
True, ipaddress.ip_address('::ffff:192.168.1.1').is_private)
diff --git
a/Misc/NEWS.d/next/Security/2024-08-07-10-42-13.gh-issue-122792.oiTMo9.rst
b/Misc/NEWS.d/next/Security/2024-08-07-10-42-13.gh-issue-122792.oiTMo9.rst
new file mode 100644
index 00000000000000..18e293ba0c03b5
--- /dev/null
+++ b/Misc/NEWS.d/next/Security/2024-08-07-10-42-13.gh-issue-122792.oiTMo9.rst
@@ -0,0 +1,3 @@
+Changed IPv4-mapped ``ipaddress.IPv6Address`` to consistently use the mapped
IPv4
+address value for deciding properties. Properties which have their behavior
fixed
+are ``is_multicast``, ``is_reserved``, ``is_link_local``, ``is_global``, and
``is_unspecified``.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]