return dbversion;
}
+ns_dbversion_t *
+ns_client_findversionid(ns_client_t *client, uintptr_t dbid) {
+ ISC_LIST_FOREACH(client->query.activeversions, dbversion, link) {
+ if ((uintptr_t)dbversion->db == dbid) {
+ return dbversion;
+ }
+ }
+
+ return NULL;
+}
+
ns_dbversion_t *
ns_client_findversion(ns_client_t *client, dns_db_t *db) {
ISC_LIST_FOREACH(client->query.activeversions, dbversion, link) {
#include <inttypes.h>
#include <stdbool.h>
+#include <stdint.h>
#include <isc/atomic.h>
#include <isc/buffer.h>
* allocated by ns_client_newdbversion().
*/
+ns_dbversion_t *
+ns_client_findversionid(ns_client_t *client, uintptr_t dbid);
+/*%<
+ * Find the active database version matching database identity 'dbid',
+ * without allocating a new database version if none is found.
+ */
+
ISC_REFCOUNT_DECL(ns_clientmgr);
void
/*! \file */
#include <stdbool.h>
+#include <stdint.h>
#include <isc/buffer.h>
#include <isc/netaddr.h>
};
};
- unsigned int restarts;
- isc_counter_t *qc;
- bool timerset;
- dns_name_t *qname;
- dns_name_t *origqname;
- dns_rdatatype_t qtype;
- unsigned int dboptions;
- unsigned int fetchoptions;
- dns_db_t *gluedb;
- dns_db_t *authdb;
- dns_zone_t *authzone;
- bool authdbset;
- bool isreferral;
- isc_mutex_t fetchlock;
+ unsigned int restarts;
+ isc_counter_t *qc;
+ bool timerset;
+ dns_name_t *qname;
+ dns_name_t *origqname;
+ dns_rdatatype_t qtype;
+ unsigned int dboptions;
+ unsigned int fetchoptions;
+ dns_db_t *gluedb;
+ uintptr_t authdb; /* Database identity; not an attached reference. */
+ dns_zone_t *authzone;
+ bool authdbset;
+ bool isreferral;
+ isc_mutex_t fetchlock;
ns_hookasync_t *hookasyncctx;
dns_rpz_st_t *rpz_st;
isc_bufferlist_t namebufs;
}
ISC_LIST_INIT(client->query.activeversions);
- if (client->query.authdb != NULL) {
- dns_db_detach(&client->query.authdb);
- }
if (client->query.authzone != NULL) {
dns_zone_detach(&client->query.authzone);
}
client->query.dboptions = 0;
client->query.fetchoptions = 0;
client->query.gluedb = NULL;
+ client->query.authdb = 0;
client->query.authdbset = false;
client->query.isreferral = false;
client->query.dns64_options = 0;
*/
if (client->query.rpz_st == NULL &&
!(client->query.wantrecursion && client->query.recursionok) &&
- client->query.authdbset && db != client->query.authdb)
+ client->query.authdbset && (uintptr_t)db != client->query.authdb)
{
return DNS_R_REFUSED;
}
* First, look within the same zone database for authoritative
* additional data.
*/
- if (!client->query.authdbset || client->query.authdb == NULL) {
+ if (!client->query.authdbset || client->query.authdb == 0) {
return ISC_R_NOTFOUND;
}
- dbversion = ns_client_findversion(client, client->query.authdb);
+ dbversion = ns_client_findversionid(client, client->query.authdb);
if (dbversion == NULL) {
return ISC_R_NOTFOUND;
}
- dns_db_attach(client->query.authdb, &db);
+ dns_db_attach(dbversion->db, &db);
version = dbversion->version;
CTRACE(ISC_LOG_DEBUG(3), "query_additionalauth: same zone");
dns_zone_gethooktable(qctx->zone);
CALL_HOOK(NS_QUERY_AUTHZONE_ATTACHED, qctx);
}
- dns_db_attach(qctx->db, &qctx->client->query.authdb);
+ qctx->client->query.authdb = (uintptr_t)qctx->db;
}
qctx->client->query.authdbset = true;