]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Skip detach when delv's client never created 11921/head
authorOndřej Surý <ondrej@isc.org>
Thu, 30 Apr 2026 07:38:40 +0000 (09:38 +0200)
committerOndřej Surý <ondrej@isc.org>
Thu, 30 Apr 2026 08:56:11 +0000 (10:56 +0200)
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
bin/delv/delv.c
bin/tests/system/digdelv/tests.sh

index c63c7be5e7210db9f477f4fab6a52b96637fdb2e..ca444cac17f163ca63d721a359fb4343dfdce759 100644 (file)
@@ -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
index e4e2482c3f3e12bdeb64a244753aa2fcee50e2c9..977812ab002fad72cc0a20f72a92895ab59da2d4 100644 (file)
@@ -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