]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-33433 Fix private address checking for IPv4 mapped IPv6. (GH-26172)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 17 May 2021 19:42:08 +0000 (12:42 -0700)
committerGitHub <noreply@github.com>
Mon, 17 May 2021 19:42:08 +0000 (12:42 -0700)
For IPv4 mapped IPv6 addresses, defer privacy check to the mapped IPv4 address. Solves bug where public mapped IPv4 addresses are considered private by the IPv6 check.

Automerge-Triggered-By: GH:gpshead
(cherry picked from commit 83f0f8d62f279f846a92fede2244beaa0149b9d8)

Co-authored-by: Pete Wicken <2273100+JamoBox@users.noreply.github.com>
Lib/ipaddress.py
Lib/test/test_ipaddress.py
Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst [new file with mode: 0644]

index af7aedfa6e51a153d3ef82a9af4b907ac2d3aeff..4a6496a5da3ef8586f98650d866986e196fdbf16 100644 (file)
@@ -16,6 +16,7 @@ import functools
 IPV4LENGTH = 32
 IPV6LENGTH = 128
 
+
 class AddressValueError(ValueError):
     """A Value Error related to the address."""
 
@@ -2002,9 +2003,13 @@ class IPv6Address(_BaseV6, _BaseAddress):
 
         Returns:
             A boolean, True if the address is reserved per
-            iana-ipv6-special-registry.
+            iana-ipv6-special-registry, or is ipv4_mapped and is
+            reserved in the iana-ipv4-special-registry.
 
         """
+        ipv4_mapped = self.ipv4_mapped
+        if ipv4_mapped is not None:
+            return ipv4_mapped.is_private
         return any(self in net for net in self._constants._private_networks)
 
     @property
index 90559ce1242c55d1588f6663ecdae33a49363842..ff77bdb1bbc5829ea8b09067b9cd99aae8a9eadc 100644 (file)
@@ -2339,6 +2339,12 @@ class IpaddrUnitTest(unittest.TestCase):
         self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
                          ipaddress.ip_address('192.168.1.1'))
 
+    def testIpv4MappedPrivateCheck(self):
+        self.assertEqual(
+                True, ipaddress.ip_address('::ffff:192.168.1.1').is_private)
+        self.assertEqual(
+                False, ipaddress.ip_address('::ffff:172.32.0.0').is_private)
+
     def testAddrExclude(self):
         addr1 = ipaddress.ip_network('10.1.1.0/24')
         addr2 = ipaddress.ip_network('10.1.1.0/26')
diff --git a/Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst b/Misc/NEWS.d/next/Library/2021-05-16-17-48-24.bpo-33433.MyzO71.rst
new file mode 100644 (file)
index 0000000..703e038
--- /dev/null
@@ -0,0 +1 @@
+For IPv4 mapped IPv6 addresses (:rfc:`4291` Section 2.5.5.2), the :mod:`ipaddress.IPv6Address.is_private` check is deferred to the mapped IPv4 address. This solves a bug where public mapped IPv4 addresses were considered private by the IPv6 check.