if (tresult != DNS_R_CONTINUE) {
result = tresult;
search.chain.len = i - 1;
+ dns_name_copy(&n->name, foundname);
node = n;
- if (foundname != NULL) {
- dns_name_copy(&node->name, foundname);
- }
}
}
/*
* We have an exact match for the name, but there are no
* active rdatasets in the desired version. That means that
- * this node doesn't exist in the desired version, and that
- * we really have a partial match.
+ * this node doesn't exist in the desired version.
+ * If there's a node above this one, reassign the
+ * foundname to the parent and treat this as a partial
+ * match.
*/
if (!wild) {
- NODE_UNLOCK(lock, &nlocktype);
- goto partial_match;
+ unsigned int len = search.chain.len - 1;
+ if (len > 0) {
+ NODE_UNLOCK(lock, &nlocktype);
+ dns_qpchain_node(&search.chain, len - 1, NULL,
+ (void **)&node, NULL);
+ dns_name_copy(&node->name, foundname);
+ goto partial_match;
+ }
}
}
dns_rdataset_init(&rdataset);
res = dns_db_find(db1, dns_rootname, v1, dns_rdatatype_soa, 0, 0, NULL,
name, &rdataset, NULL);
- assert_int_equal(res, DNS_R_NXDOMAIN);
+ /*
+ * Note: in the QPzone database, the root node always exists,
+ * even if it's empty, so we would get DNS_R_NXRRSET from this
+ * query. In other databases (including the old RBTDB) the root
+ * node can be nonexistent, and the query would then return
+ * DNS_R_NXDOMAIN. Allow for both possibilities.
+ */
+ assert_true(res == DNS_R_NXRRSET || res == DNS_R_NXDOMAIN);
if (dns_rdataset_isassociated(&rdataset)) {
dns_rdataset_disassociate(&rdataset);