echo_i "checking negative validation NXDOMAIN NSEC3 ($n)"
ret=0
-dig_with_opts +noauth q.nsec3.example. \
+dig_with_opts +noauth a.b.c.d.e.f.g.h.i.j.nsec3.example. \
@10.53.0.3 a >dig.out.ns3.test$n || ret=1
-dig_with_opts +noauth q.nsec3.example. \
+dig_with_opts +noauth a.b.c.d.e.f.g.h.i.j.nsec3.example. \
@10.53.0.4 a >dig.out.ns4.test$n || ret=1
digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
grep "flags:.*ad.*QUERY" dig.out.ns4.test$n >/dev/null || ret=1
: DNS_R_NXDOMAIN;
}
} else {
- result = active ? DNS_R_EMPTYNAME : DNS_R_NXDOMAIN;
+ bool wantpartial = (options & DNS_DBFIND_WANTPARTIAL) !=
+ 0;
+ result = active ? DNS_R_EMPTYNAME
+ : wantpartial ? DNS_R_PARTIALMATCH
+ : DNS_R_NXDOMAIN;
}
goto tree_exit;
} else if (result != ISC_R_SUCCESS) {
: DNS_R_NXDOMAIN;
}
} else {
- result = active ? DNS_R_EMPTYNAME : DNS_R_NXDOMAIN;
+ bool wantpartial = (options & DNS_DBFIND_WANTPARTIAL) !=
+ 0;
+ result = active ? DNS_R_EMPTYNAME
+ : wantpartial ? DNS_R_PARTIALMATCH
+ : DNS_R_NXDOMAIN;
}
goto tree_exit;
} else if (result != ISC_R_SUCCESS) {
* Find the closest encloser.
*/
dns_name_copy(name, cname);
+ bool once = true;
while (result == DNS_R_NXDOMAIN) {
labels = dns_name_countlabels(cname) - 1;
/*
goto cleanup;
}
dns_name_split(cname, labels, NULL, cname);
- result = dns_db_findext(qctx->db, cname, qctx->version,
- dns_rdatatype_nsec, options, 0,
- NULL, fname, &cm, &ci, NULL,
- NULL);
+ result = dns_db_findext(
+ qctx->db, cname, qctx->version,
+ dns_rdatatype_nsec,
+ options | (once ? DNS_DBFIND_WANTPARTIAL : 0),
+ 0, NULL, fname, &cm, &ci, NULL, NULL);
+ if (result == DNS_R_PARTIALMATCH && once) {
+ unsigned int flabels =
+ dns_name_countlabels(fname);
+ if (labels > flabels + 1) {
+ dns_name_split(cname, flabels + 1, NULL,
+ cname);
+ }
+ result = DNS_R_NXDOMAIN;
+ }
+ once = false;
}
/*
* Add closest (provable) encloser NSEC3.