summaryrefslogtreecommitdiffstats
path: root/Lib/ipaddress.py
diff options
context:
space:
mode:
authorFaidon Liambotis <paravoid@debian.org>2024-04-25 15:17:40 (GMT)
committerGitHub <noreply@github.com>2024-04-25 15:17:40 (GMT)
commitfb7f79b4da35b75cdc82ff3cf20816d2bf93d416 (patch)
treeae468509ee068193e62ebcbf9df92f019d1377a0 /Lib/ipaddress.py
parenteb20a7d12c4b2ab7931074843f8602a48b5b07bd (diff)
downloadcpython-fb7f79b4da35b75cdc82ff3cf20816d2bf93d416.zip
cpython-fb7f79b4da35b75cdc82ff3cf20816d2bf93d416.tar.gz
cpython-fb7f79b4da35b75cdc82ff3cf20816d2bf93d416.tar.bz2
gh-117566: fix IPv6Address.is_loopback for IPv4-mapped loopbacks (GH-117567)
While properties like IPv6Address.is_private account for IPv4-mapped IPv6 addresses, such as for example: >>> ipaddress.ip_address("192.168.0.1").is_private True >>> ipaddress.ip_address("::ffff:192.168.0.1").is_private True ...the same doesn't currently apply to the is_loopback property: >>> ipaddress.ip_address("127.0.0.1").is_loopback True >>> ipaddress.ip_address("::ffff:127.0.0.1").is_loopback False At minimum, this inconsistency between different properties is counter-intuitive. Moreover, ::ffff:127.0.0.0/104 is for all intents and purposes a loopback address, and should be treated as such.
Diffstat (limited to 'Lib/ipaddress.py')
-rw-r--r--Lib/ipaddress.py5
1 files changed, 4 insertions, 1 deletions
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
index 22cdfc9..8e4d49c 100644
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -2142,6 +2142,9 @@ class IPv6Address(_BaseV6, _BaseAddress):
RFC 2373 2.5.3.
"""
+ ipv4_mapped = self.ipv4_mapped
+ if ipv4_mapped is not None:
+ return ipv4_mapped.is_loopback
return self._ip == 1
@property
@@ -2258,7 +2261,7 @@ class IPv6Interface(IPv6Address):
@property
def is_loopback(self):
- return self._ip == 1 and self.network.is_loopback
+ return super().is_loopback and self.network.is_loopback
class IPv6Network(_BaseV6, _BaseNetwork):