Skip to content

Commit edc4a55

Browse files
authored
fix: avoid including scope_id in IPv6Address object if its zero (#1367)
1 parent c4c2dee commit edc4a55

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

src/zeroconf/_utils/ipaddress.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def _cached_ip_addresses(address: Union[str, bytes, int]) -> Optional[Union[IPv4
104104

105105
def get_ip_address_object_from_record(record: DNSAddress) -> Optional[Union[IPv4Address, IPv6Address]]:
106106
"""Get the IP address object from the record."""
107-
if IPADDRESS_SUPPORTS_SCOPE_ID and record.type == _TYPE_AAAA and record.scope_id is not None:
107+
if IPADDRESS_SUPPORTS_SCOPE_ID and record.type == _TYPE_AAAA and record.scope_id:
108108
return ip_bytes_and_scope_to_address(record.address, record.scope_id)
109109
return cached_ip_addresses_wrapper(record.address)
110110

tests/utils/test_ipaddress.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
"""Unit tests for zeroconf._utils.ipaddress."""
44

5+
import sys
6+
7+
import pytest
8+
9+
from zeroconf import const
10+
from zeroconf._dns import DNSAddress
511
from zeroconf._utils import ipaddress
612

713

@@ -34,3 +40,34 @@ def test_cached_ip_addresses_wrapper():
3440
assert ipv6 is not None
3541
assert ipv6.is_link_local is False
3642
assert ipv6.is_unspecified is True
43+
44+
45+
@pytest.mark.skipif(sys.version_info < (3, 9, 0), reason='scope_id is not supported')
46+
def test_get_ip_address_object_from_record():
47+
"""Test the get_ip_address_object_from_record."""
48+
# not link local
49+
packed = b'&\x06(\x00\x02 \x00\x01\x02H\x18\x93%\xc8\x19F'
50+
record = DNSAddress(
51+
'domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=3
52+
)
53+
assert record.scope_id == 3
54+
assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address(
55+
'2606:2800:220:1:248:1893:25c8:1946'
56+
)
57+
58+
# link local
59+
packed = b'\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
60+
record = DNSAddress(
61+
'domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=3
62+
)
63+
assert record.scope_id == 3
64+
assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1%3')
65+
record = DNSAddress('domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed)
66+
assert record.scope_id is None
67+
assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1')
68+
record = DNSAddress(
69+
'domain.local', const._TYPE_A, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=0
70+
)
71+
assert record.scope_id == 0
72+
# Ensure scope_id of 0 is not appended to the address
73+
assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1')

0 commit comments

Comments
 (0)