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",
[