diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 9af5626059..5e51664763 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -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)); diff --git a/src/resolve/resolved-dns-delegate.c b/src/resolve/resolved-dns-delegate.c index db34916a29..bfe2860366 100644 --- a/src/resolve/resolved-dns-delegate.c +++ b/src/resolve/resolved-dns-delegate.c @@ -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( diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c index a269414ccf..0f341d740a 100644 --- a/src/resolve/resolved-link-bus.c +++ b/src/resolve/resolved-link-bus.c @@ -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; diff --git a/test/units/TEST-75-RESOLVED.sh b/test/units/TEST-75-RESOLVED.sh index 85e9e4cc84..44cc71ba9f 100755 --- a/test/units/TEST-75-RESOLVED.sh +++ b/test/units/TEST-75-RESOLVED.sh @@ -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 <