resolved: fix domain replacement and delegate DNS parsing (#43365)

This commit is contained in:
Yu Watanabe
2026-08-14 00:29:26 +09:00
committed by GitHub
4 changed files with 27 additions and 2 deletions
+3
View File
@@ -1161,6 +1161,9 @@ static int verb_tlsa(int argc, char *argv[], uintptr_t _data, void *userdata) {
} else
args = strv_skip(argv, 1);
if (strv_isempty(args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "The tlsa command requires at least one domain.");
STRV_FOREACH(p, args)
RET_GATHER(ret, resolve_tlsa(family, *p));
+1 -1
View File
@@ -281,7 +281,7 @@ int config_parse_delegate_dns_servers(
/* Drop the marker. This is used to find the servers that ceased to exist, see
* manager_mark_dns_servers() and manager_flush_marked_dns_servers(). */
dns_server_move_back_and_unmark(s);
return 0;
continue;
}
r = dns_server_new(
+4
View File
@@ -392,6 +392,10 @@ int bus_link_method_set_domains(sd_bus_message *message, void *userdata, sd_bus_
dns_search_domain_move_back_and_unmark(d);
else {
r = dns_search_domain_new(l->manager, &d, DNS_SEARCH_DOMAIN_LINK, l, /* delegate= */ NULL, name);
if (r == -E2BIG) {
changed = dns_search_domain_unlink_marked(l->search_domains) || changed;
r = dns_search_domain_new(l->manager, &d, DNS_SEARCH_DOMAIN_LINK, l, /* delegate= */ NULL, name);
}
if (r < 0)
goto clear;
+19 -1
View File
@@ -290,6 +290,21 @@ manual_testcase_01_resolvectl() {
assert_in "DOMAINS=~route-only-change.example.com" "$(cat "$hoge_state")"
assert_not_in "route-only-change.example.com" "$(cat /run/systemd/resolve/resolv.conf /run/systemd/resolve/stub-resolv.conf)"
resolvectl domain hoge "old.example.com"
local domains=()
for i in {1..1025}; do
domains+=("too-many-$i.example.com")
done
(! resolvectl domain hoge "${domains[@]}")
assert_in 'old.example.com' "$(resolvectl domain hoge)"
domains=()
for i in {1..1024}; do
domains+=("replacement-$i.example.com")
done
resolvectl domain hoge "${domains[@]}"
assert_not_in 'old.example.com' "$(resolvectl domain hoge)"
assert_in 'replacement-1024.example.com' "$(resolvectl domain hoge)"
echo -e "nameserver 10.0.2.1\ndomain test-domain.example.com" | SYSTEMD_INVOKED_AS=resolvconf resolvectl -x -a hoge
assert_in 'test-domain.example.com' "$(resolvectl domain hoge)"
assert_in '~.' "$(resolvectl domain hoge)"
@@ -627,6 +642,8 @@ testcase_08_resolved() {
grep -qF '"data":"' "$RUN_OUT"
(! run resolvectl openpgp mr.smith@signed.test --json=short --type=A)
grep -qF -- "The openpgp command may only be combined with --type=OPENPGPKEY." "$RUN_OUT"
(! run resolvectl tlsa tcp)
grep -qF -- "The tlsa command requires at least one domain." "$RUN_OUT"
(! run resolvectl tlsa signed.test:invalid --json=short)
grep -qF 'Invalid port "invalid".' "$RUN_OUT"
(! run resolvectl tlsa signed.test --json=short --type=A)
@@ -1491,7 +1508,7 @@ testcase_delegate() {
mkdir -p /run/systemd/dns-delegate.d/
cat >/run/systemd/dns-delegate.d/testcase.dns-delegate <<EOF
[Delegate]
DNS=192.168.77.78
DNS=192.168.77.78 192.168.77.78 192.168.77.79
Domains=exercise.test
FirewallMark=42
EOF
@@ -1499,6 +1516,7 @@ EOF
resolvectl status
assert_eq "$(resolvectl --json=short | jq -rc '.[] | select(.delegate == "testcase") | .servers | .[0].addressString')" '192.168.77.78'
assert_eq "$(resolvectl --json=short | jq -rc '.[] | select(.delegate == "testcase") | .servers | .[1].addressString')" '192.168.77.79'
assert_eq "$(resolvectl --json=short | jq -rc '.[] | select(.delegate == "testcase") | .searchDomains | .[0].name')" 'exercise.test'
# Now that we installed the delegation the resolution should fail, because nothing is listening on that IP address