From 628e8304cc25f1995d069e6e3dfed8f574fef988 Mon Sep 17 00:00:00 2001 From: dongshengyuan <545258830@qq.com> Date: Tue, 11 Aug 2026 20:16:45 +0800 Subject: [PATCH] resolved: notice route-only domain updates SetLinkDomains() tracks whether the configured search domain list changed so it can skip redundant persistence. The route_only flag is part of the D-Bus API and is persisted as a ~ prefix, but flipping an existing domain between search and route-only only updated in-memory state and left changed false. The method then skipped link_save_user() and manager_write_resolv_conf(), leaving stale state until restart. Reproduced on Ubuntu with systemd 259: sudo resolvectl domain enp1s0 route-only-repro.test sudo resolvectl domain enp1s0 '~route-only-repro.test' resolvectl domain enp1s0 grep '^DOMAINS=' /run/systemd/resolve/netif/$(cat /sys/class/net/enp1s0/ifindex) grep -H route-only-repro.test /run/systemd/resolve/*.conf Before, resolvectl showed ~route-only-repro.test, but the persisted state file still showed DOMAINS=route-only-repro.test, and the generated resolv.conf files still contained search route-only-repro.test. After this change, the state file is updated to DOMAINS=~route-only-repro.test and the generated resolv.conf files are refreshed so the route-only domain is not emitted as a search domain. Follow-up for: cbf23f385381f1df2149b18d1fa2411356d76ad8 --- src/resolve/resolved-link-bus.c | 5 ++++- test/units/TEST-75-RESOLVED.sh | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/resolve/resolved-link-bus.c b/src/resolve/resolved-link-bus.c index ba5b00c239..a269414ccf 100644 --- a/src/resolve/resolved-link-bus.c +++ b/src/resolve/resolved-link-bus.c @@ -398,7 +398,10 @@ int bus_link_method_set_domains(sd_bus_message *message, void *userdata, sd_bus_ changed = true; } - d->route_only = route_only; + if (d->route_only != route_only) { + d->route_only = route_only; + changed = true; + } } r = sd_bus_message_exit_container(message); diff --git a/test/units/TEST-75-RESOLVED.sh b/test/units/TEST-75-RESOLVED.sh index ce7675e8ce..85e9e4cc84 100755 --- a/test/units/TEST-75-RESOLVED.sh +++ b/test/units/TEST-75-RESOLVED.sh @@ -280,6 +280,16 @@ manual_testcase_01_resolvectl() { resolvectl domain hoge "hoge.example.com" assert_in 'hoge.example.com' "$(resolvectl domain hoge)" assert_not_in '~.' "$(resolvectl domain hoge)" + + local hoge_state + hoge_state="/run/systemd/resolve/netif/$(cat /sys/class/net/hoge/ifindex)" + resolvectl domain hoge "route-only-change.example.com" + assert_in "DOMAINS=route-only-change.example.com" "$(cat "$hoge_state")" + assert_in "route-only-change.example.com" "$(cat /run/systemd/resolve/resolv.conf /run/systemd/resolve/stub-resolv.conf)" + resolvectl domain hoge "~route-only-change.example.com" + 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)" + 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)"