From a4be4ad8abad36ae2ac5c73fc00f4467fbb06404 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 7 Dec 2023 14:28:12 +0900 Subject: [PATCH 1/2] resolve: do not trigger assertion on exit By making assert_return() critical, we observe the following: --- Program received signal SIGABRT, Aborted. 0x00007f01320b0884 in __pthread_kill_implementation () from /lib64/libc.so.6 (gdb) bt #0 0x00007f01320b0884 in __pthread_kill_implementation () from /lib64/libc.so.6 #1 0x00007f013205fafe in raise () from /lib64/libc.so.6 #2 0x00007f013204887f in abort () from /lib64/libc.so.6 #3 0x00007f01338d02d6 in log_assert_failed ( text=0x7f01340009e0 "e->state != SD_EVENT_FINISHED", file=0x7f0133fff403 "src/libsystemd/sd-event/sd-event.c", line=1399, func=0x7f01340045a0 <__func__.148> "sd_event_add_time") at ../src/basic/log.c:948 #4 0x00007f01338d0457 in log_assert_failed_return ( text=0x7f01340009e0 "e->state != SD_EVENT_FINISHED", file=0x7f0133fff403 "src/libsystemd/sd-event/sd-event.c", line=1399, func=0x7f01340045a0 <__func__.148> "sd_event_add_time") at ../src/basic/log.c:967 #5 0x00007f0133c7ed83 in sd_event_add_time (e=0x617000022280, ret=0x610000007e98, clock=7, usec=24054941030, accuracy=0, callback=0x4625b4 , userdata=0x610000007e40) at ../src/libsystemd/sd-event/sd-event.c:1399 #6 0x00007f0133c7f725 in sd_event_add_time_relative (e=0x617000022280, ret=0x610000007e98, clock=7, usec=1000000, accuracy=0, callback=0x4625b4 , userdata=0x610000007e40) at ../src/libsystemd/sd-event/sd-event.c:1462 #7 0x0000000000464cac in dns_scope_announce (scope=0x610000007e40, goodbye=true) at ../src/resolve/resolved-dns-scope.c:1530 #8 0x0000000000504d08 in link_free (l=0x612000023d40) at ../src/resolve/resolved-link.c:83 #9 0x000000000052dbbd in manager_free (m=0x619000000a80) at ../src/resolve/resolved-manager.c:697 #10 0x0000000000562328 in manager_freep (p=0x7f012f800040) at ../src/resolve/resolved-manager.h:198 #11 0x000000000056315a in run (argc=1, argv=0x7fff22b06468) at ../src/resolve/resolved.c:25 #12 0x0000000000563284 in main (argc=1, argv=0x7fff22b06468) at ../src/resolve/resolved.c:99 --- Prompted by https://github.com/systemd/systemd/pull/30049#issuecomment-1844087965. --- src/resolve/resolved-dns-scope.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index d9d8acfd25..2e8b3e5580 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -1428,6 +1428,14 @@ int dns_scope_announce(DnsScope *scope, bool goodbye) { if (scope->protocol != DNS_PROTOCOL_MDNS) return 0; + r = sd_event_get_state(scope->manager->event); + if (r < 0) + return log_debug_errno(r, "Failed to get event loop state: %m"); + + /* If this is called on exit, through manager_free() -> link_free(), then we cannot announce. */ + if (r == SD_EVENT_FINISHED) + return 0; + /* Check if we're done with probing. */ LIST_FOREACH(transactions_by_scope, t, scope->transactions) if (t->probing && DNS_TRANSACTION_IS_LIVE(t->state)) From b1384db11b565dc28e38b5fa70a0e263972b2c3b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 7 Dec 2023 15:19:10 +0900 Subject: [PATCH 2/2] test: check if resolved exits cleanly --- test/units/testsuite-75.sh | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/test/units/testsuite-75.sh b/test/units/testsuite-75.sh index 064dd3807a..5dc31f8baa 100755 --- a/test/units/testsuite-75.sh +++ b/test/units/testsuite-75.sh @@ -43,6 +43,13 @@ monitor_check_rr() ( timeout -v 30s journalctl -u resolvectl-monitor.service --since "$since" -f --full | grep -m1 "$match" ) +restart_resolved() { + systemctl stop systemd-resolved.service + (! systemctl is-failed systemd-resolved.service) + systemctl start systemd-resolved.service + systemctl service-log-level systemd-resolved.service debug +} + # Test for resolvectl, resolvconf systemctl unmask systemd-resolved.service systemctl enable --now systemd-resolved.service @@ -89,8 +96,7 @@ mkdir -p /run/systemd/resolved.conf.d echo "MulticastDNS=yes" echo "LLMNR=yes" } >/run/systemd/resolved.conf.d/mdns-llmnr.conf -systemctl restart systemd-resolved.service -systemctl service-log-level systemd-resolved.service debug +restart_resolved # make sure networkd is not running. systemctl stop systemd-networkd.service # defaults to yes (both the global and per-link settings are yes) @@ -115,8 +121,7 @@ assert_in 'no' "$(resolvectl llmnr hoge)" echo "MulticastDNS=resolve" echo "LLMNR=resolve" } >/run/systemd/resolved.conf.d/mdns-llmnr.conf -systemctl restart systemd-resolved.service -systemctl service-log-level systemd-resolved.service debug +restart_resolved # set per-link setting resolvectl mdns hoge yes resolvectl llmnr hoge yes @@ -136,8 +141,7 @@ assert_in 'no' "$(resolvectl llmnr hoge)" echo "MulticastDNS=no" echo "LLMNR=no" } >/run/systemd/resolved.conf.d/mdns-llmnr.conf -systemctl restart systemd-resolved.service -systemctl service-log-level systemd-resolved.service debug +restart_resolved # set per-link setting resolvectl mdns hoge yes resolvectl llmnr hoge yes @@ -222,7 +226,7 @@ ln -svf /etc/bind.keys /etc/bind/bind.keys # Start the services systemctl unmask systemd-networkd systemctl start systemd-networkd -systemctl restart systemd-resolved +restart_resolved # Create knot's runtime dir, since from certain version it's provided only by # the package and not created by tmpfiles/systemd if [[ ! -d /run/knot ]]; then @@ -587,8 +591,7 @@ if command -v nft >/dev/null; then echo "StaleRetentionSec=1d" } >/run/systemd/resolved.conf.d/test.conf ln -svf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf - systemctl restart systemd-resolved.service - systemctl service-log-level systemd-resolved.service debug + restart_resolved run dig stale1.unsigned.test -t A grep -qE "NOERROR" "$RUN_OUT" @@ -711,4 +714,7 @@ run resolvectl reset-statistics --json=pretty run resolvectl reset-statistics --json=short +# Check if resolved exits cleanly. +restart_resolved + touch /testok