mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-10 20:10:04 -04:00
When searching a cache db, we did not look for an NS record at the node, so we
sometimes did not find the deepest zone cut. E.g. If you look for A records at "com." then you should get a delegation for "com." and not one for ".". In the various rdataset find routines, we sometimes attempted to bind the rdataset even if the rdataset pointer was NULL. Remove inline from a few functions. Add inline to a few others.
This commit is contained in:
parent
da1eb108c6
commit
10e905959e
1 changed files with 33 additions and 8 deletions
|
|
@ -283,7 +283,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb) {
|
|||
isc_mem_put(rbtdb->common.mctx, rbtdb, sizeof *rbtdb);
|
||||
}
|
||||
|
||||
static void
|
||||
static inline void
|
||||
maybe_free_rbtdb(dns_rbtdb_t *rbtdb) {
|
||||
isc_boolean_t want_free = ISC_TRUE;
|
||||
unsigned int i;
|
||||
|
|
@ -426,7 +426,7 @@ free_rdataset(isc_mem_t *mctx, rdatasetheader_t *rdataset) {
|
|||
isc_mem_put(mctx, rdataset, size);
|
||||
}
|
||||
|
||||
static void
|
||||
static inline void
|
||||
rollback_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, rbtdb_serial_t serial) {
|
||||
rdatasetheader_t *header, *header_next;
|
||||
|
||||
|
|
@ -573,7 +573,7 @@ new_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) {
|
|||
INSIST(node->references != 0);
|
||||
}
|
||||
|
||||
static inline void
|
||||
static void
|
||||
no_references(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
||||
rbtdb_serial_t least_serial)
|
||||
{
|
||||
|
|
@ -1261,7 +1261,7 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
result = DNS_R_SUCCESS;
|
||||
}
|
||||
|
||||
if (type != dns_rdatatype_any)
|
||||
if (rdataset != NULL && type != dns_rdatatype_any)
|
||||
bind_rdataset(search.rbtdb, node, header, rdataset);
|
||||
|
||||
node_exit:
|
||||
|
|
@ -1428,7 +1428,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
rbtdb_search_t search;
|
||||
isc_boolean_t cname_ok = ISC_TRUE;
|
||||
isc_boolean_t empty_node;
|
||||
rdatasetheader_t *header, *nxtheader;
|
||||
rdatasetheader_t *header, *nsheader, *nxtheader;
|
||||
|
||||
/*
|
||||
* XXXRTH Currently this code has no support for negative caching,
|
||||
|
|
@ -1496,6 +1496,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
|
||||
LOCK(&(search.rbtdb->node_locks[node->locknum].lock));
|
||||
|
||||
nsheader = NULL;
|
||||
nxtheader = NULL;
|
||||
empty_node = ISC_TRUE;
|
||||
for (header = node->data; header != NULL; header = header->next) {
|
||||
|
|
@ -1514,6 +1515,13 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
(cname_ok && header->type ==
|
||||
dns_rdatatype_cname)) {
|
||||
break;
|
||||
} else if (header->type == dns_rdatatype_ns) {
|
||||
/*
|
||||
* Remember a NS rdataset even if we're
|
||||
* not specifically looking for it, because
|
||||
* we might need it later.
|
||||
*/
|
||||
nsheader = header;
|
||||
} else if (header->type == dns_rdatatype_nxt) {
|
||||
/*
|
||||
* Remember a NXT rdataset even if we're
|
||||
|
|
@ -1545,6 +1553,22 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
* yet try to use the NXT that way, but this is the place to
|
||||
* do it.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If there is an NS rdataset at this node, then this is the
|
||||
* deepest zone cut.
|
||||
*/
|
||||
if (nsheader != NULL) {
|
||||
new_reference(search.rbtdb, node);
|
||||
*nodep = node;
|
||||
bind_rdataset(search.rbtdb, node, nsheader, rdataset);
|
||||
result = DNS_R_DELEGATION;
|
||||
goto node_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Go find the deepest zone cut.
|
||||
*/
|
||||
UNLOCK(&(search.rbtdb->node_locks[node->locknum].lock));
|
||||
goto find_ns;
|
||||
}
|
||||
|
|
@ -1574,9 +1598,10 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
|
|||
result = DNS_R_SUCCESS;
|
||||
}
|
||||
|
||||
if (type != dns_rdatatype_any)
|
||||
if (rdataset != NULL && type != dns_rdatatype_any)
|
||||
bind_rdataset(search.rbtdb, node, header, rdataset);
|
||||
|
||||
node_exit:
|
||||
UNLOCK(&(search.rbtdb->node_locks[node->locknum].lock));
|
||||
|
||||
tree_exit:
|
||||
|
|
@ -1787,7 +1812,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
return (DNS_R_SUCCESS);
|
||||
}
|
||||
|
||||
static inline dns_result_t
|
||||
static dns_result_t
|
||||
add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
||||
rdatasetheader_t *newheader, isc_boolean_t merge, isc_boolean_t loading)
|
||||
{
|
||||
|
|
@ -2496,7 +2521,7 @@ rdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {
|
|||
* Database Iterator Methods
|
||||
*/
|
||||
|
||||
static dns_result_t
|
||||
static inline dns_result_t
|
||||
resume_iteration(rbtdb_dbiterator_t *rbtiterator) {
|
||||
return (DNS_R_NOTIMPLEMENTED);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue