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=96d3b2996821ca6a7db93e98630235febbc52e1e;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 (cherry picked from commit dba102ef16821f91f0494f9db5c9a646dcab913f) --- diff --git a/bin/delv/delv.c b/bin/delv/delv.c index a12c54bb44e..927100e72e4 100644 --- a/bin/delv/delv.c +++ b/bin/delv/delv.c @@ -1982,7 +1982,9 @@ cleanup: isc_mem_put(mctx, namelist, sizeof(*namelist)); isc_loopmgr_shutdown(loopmgr); - 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 6f8dacdaca7..f63033271c6 100644 --- a/bin/tests/system/digdelv/tests.sh +++ b/bin/tests/system/digdelv/tests.sh @@ -1428,6 +1428,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