Commit bf96e8fc0c for bind

commit bf96e8fc0cd0264139eb012288bbbe617b1c83d4
Author: OndÅ™ej Surý <ondrej@isc.org>
Date:   Tue Nov 10 12:24:34 2026 +0100

    Report immediate resolution failures in delv +yaml output

    When the resolution failed before it was started, as it now does for
    RRSIG queries, delv +yaml printed nothing at all. Print the same
    result document as for a failure reported by the resolver.

    Assisted-by: Claude:claude-fable-5-2

diff --git a/bin/delv/delv.c b/bin/delv/delv.c
index 795fdababf..e80b48cb2d 100644
--- a/bin/delv/delv.c
+++ b/bin/delv/delv.c
@@ -1820,23 +1820,35 @@ get_reverse(char *reverse, size_t len, char *value, bool strict) {
 	}
 }

+/*
+ * Report the outcome of the resolution; in YAML mode, this starts the
+ * result document, which the answer records (if any) are appended to.
+ */
 static void
-resolve_cb(dns_client_t *client, const dns_name_t *query_name,
-	   dns_namelist_t *namelist, isc_result_t result) {
+print_result(const dns_name_t *query_name, isc_result_t result) {
 	char namestr[DNS_NAME_FORMATSIZE];

-	if (result != ISC_R_SUCCESS && !yaml) {
-		delv_log(ISC_LOG_ERROR, "resolution failed: %s",
-			 isc_result_totext(result));
+	if (!yaml) {
+		if (result != ISC_R_SUCCESS) {
+			delv_log(ISC_LOG_ERROR, "resolution failed: %s",
+				 isc_result_totext(result));
+		}
+		return;
 	}

-	if (yaml) {
-		printf("type: DELV_RESULT\n");
+	printf("type: DELV_RESULT\n");
+	if (query_name != NULL) {
 		dns_name_format(query_name, namestr, sizeof(namestr));
 		printf("query_name: %s\n", namestr);
-		printf("status: %s\n", isc_result_totext(result));
-		printf("records:\n");
 	}
+	printf("status: %s\n", isc_result_totext(result));
+	printf("records:\n");
+}
+
+static void
+resolve_cb(dns_client_t *client, const dns_name_t *query_name,
+	   dns_namelist_t *namelist, isc_result_t result) {
+	print_result(query_name, result);

 	ISC_LIST_FOREACH(*namelist, response_name, link) {
 		ISC_LIST_FOREACH(response_name->list, rdataset, link) {
@@ -1904,10 +1916,7 @@ run_resolve(void *arg) {
 				 resopt, namelist, resolve_cb));
 	return;
 cleanup:
-	if (!yaml) {
-		delv_log(ISC_LOG_ERROR, "resolution failed: %s",
-			 isc_result_totext(result));
-	}
+	print_result(query_name, result);

 	isc_mem_put(isc_g_mctx, namelist, sizeof(*namelist));
 	isc_loopmgr_shutdown();
diff --git a/bin/tests/system/digdelv/tests_digdelv_delv.py b/bin/tests/system/digdelv/tests_digdelv_delv.py
index 49d10e1419..88d2de672a 100644
--- a/bin/tests/system/digdelv/tests_digdelv_delv.py
+++ b/bin/tests/system/digdelv/tests_digdelv_delv.py
@@ -263,6 +263,17 @@ def test_rrsig_query(delv, ns3):
     assert Re(r"^example\.") not in result.out


+def test_rrsig_query_yaml(delv, ns3):
+    """
+    Check that delv +yaml reports the failure of an RRSIG query.
+    """
+    result = delv(f"+yaml @{ns3.ip} -t RRSIG example")
+    data = parse_yaml(result.out)
+    assert data["status"] == "FORMERR"
+    assert data["query_name"] == "example"
+    assert data["records"] is None
+
+
 @pytest.mark.parametrize(
     "anchor",
     [