From: Dmitry V. Levin Date: Mon, 10 Jul 2023 08:00:00 +0000 (+0000) Subject: resolved: fix the canonical name returned by hosts lookup by address X-Git-Tag: v254-rc2~11^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0ff8f2a33a8f7c225860388faf43fa83f106cfe3;p=thirdparty%2Fsystemd.git resolved: fix the canonical name returned by hosts lookup by address In etc_hosts_lookup_by_address(), make sure the canonical name of the given address is returned first in the list of names that address resolves to. Resolves: #25088 --- diff --git a/src/resolve/resolved-etc-hosts.c b/src/resolve/resolved-etc-hosts.c index aac7d986ba0..fd5c6b78148 100644 --- a/src/resolve/resolved-etc-hosts.c +++ b/src/resolve/resolved-etc-hosts.c @@ -381,6 +381,20 @@ static int manager_etc_hosts_read(Manager *m) { return 1; } +static int answer_add_ptr(DnsAnswer *answer, DnsResourceKey *key, const char *name) { + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + rr = dns_resource_record_new(key); + if (!rr) + return -ENOMEM; + + rr->ptr.name = strdup(name); + if (!rr->ptr.name) + return -ENOMEM; + + return dns_answer_add(answer, rr, 0, DNS_ANSWER_AUTHENTICATED, NULL); +} + static int etc_hosts_lookup_by_address( EtcHosts *hosts, DnsQuestion *q, @@ -427,18 +441,17 @@ static int etc_hosts_lookup_by_address( if (r < 0) return r; - SET_FOREACH(n, item->names) { - _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; - - rr = dns_resource_record_new(found_ptr); - if (!rr) - return -ENOMEM; + if (item->canonical_name) { + r = answer_add_ptr(*answer, found_ptr, item->canonical_name); + if (r < 0) + return r; + } - rr->ptr.name = strdup(n); - if (!rr->ptr.name) - return -ENOMEM; + SET_FOREACH(n, item->names) { + if (n == item->canonical_name) + continue; - r = dns_answer_add(*answer, rr, 0, DNS_ANSWER_AUTHENTICATED, NULL); + r = answer_add_ptr(*answer, found_ptr, n); if (r < 0) return r; } diff --git a/test/units/testsuite-75.sh b/test/units/testsuite-75.sh index ef0e42a81d5..504d1038e5e 100755 --- a/test/units/testsuite-75.sh +++ b/test/units/testsuite-75.sh @@ -160,10 +160,12 @@ ip link del hoge.foo ### SETUP ### # Configure network hostnamectl hostname ns1.unsigned.test -{ - echo "10.0.0.1 ns1.unsigned.test" - echo "fd00:dead:beef:cafe::1 ns1.unsigned.test" -} >>/etc/hosts +cat >>/etc/hosts </etc/systemd/network/dns0.netdev <