From: Ondřej Surý Date: Thu, 30 Apr 2026 07:38:40 +0000 (+0200) Subject: Skip detach when delv's client never created X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dba102ef16821f91f0494f9db5c9a646dcab913f;p=thirdparty%2Fbind9.git Skip detach when delv's client never created run_resolve allocates dns_client_t late, but the cleanup epilogue called dns_client_detach() unconditionally. When convert_name() or dns_client_create() failed first, the detach hit a NULL client and the REQUIRE(DNS_CLIENT_VALID) inside it aborted the process with SIGABRT instead of a clean error exit. Guard the detach with a NULL check. Add a digdelv test that runs delv on a query name whose first label exceeds 63 octets and asserts the process does not exit 134. Assisted-by: Claude:claude-opus-4-7 --- diff --git a/bin/delv/delv.c b/bin/delv/delv.c index c63c7be5e72..ca444cac17f 100644 --- a/bin/delv/delv.c +++ b/bin/delv/delv.c @@ -1911,7 +1911,9 @@ cleanup: isc_mem_put(isc_g_mctx, namelist, sizeof(*namelist)); isc_loopmgr_shutdown(); - dns_client_detach(&client); + if (client != NULL) { + dns_client_detach(&client); + } } static void diff --git a/bin/tests/system/digdelv/tests.sh b/bin/tests/system/digdelv/tests.sh index e4e2482c3f3..977812ab002 100644 --- a/bin/tests/system/digdelv/tests.sh +++ b/bin/tests/system/digdelv/tests.sh @@ -1533,6 +1533,18 @@ if [ -x "$DELV" ]; then if [ $ret -ne 0 ]; then echo_i "failed"; fi status=$((status + ret)) + n=$((n + 1)) + echo_i "checking delv exits cleanly on malformed query name ($n)" + ret=0 + longlabel="$(printf 'a%.0s' $(seq 1 64))" + delv_with_opts @10.53.0.3 -t a "$longlabel.example.com" >delv.out.test$n 2>&1 + rc=$? + # Pre-fix: SIGABRT (exit 134) from dns_client_detach(NULL) in run_resolve cleanup. + [ $rc -eq 134 ] && ret=1 + grep "label too long" delv.out.test$n >/dev/null || ret=1 + if [ $ret -ne 0 ]; then echo_i "failed"; fi + status=$((status + ret)) + n=$((n + 1)) echo_i "checking delv with IPv6 on IPv4 does not work ($n)" if testsock6 fd92:7065:b8e:ffff::3 2>/dev/null; then