diff options
author | Faidon Liambotis <paravoid@debian.org> | 2024-04-25 15:17:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-25 15:17:40 (GMT) |
commit | fb7f79b4da35b75cdc82ff3cf20816d2bf93d416 (patch) | |
tree | ae468509ee068193e62ebcbf9df92f019d1377a0 /Lib/ipaddress.py | |
parent | eb20a7d12c4b2ab7931074843f8602a48b5b07bd (diff) | |
download | cpython-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.py | 5 |
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): |