#define SFCACHE_CDFLAG 0x1
-/*
- * SAVE and RESTORE have the same semantics as:
- *
- * foo_attach(b, &a);
- * foo_detach(&b);
- *
- * without the locking and magic testing.
- *
- * We use the names SAVE and RESTORE to show the operation being performed,
- * even though the two macros are identical.
- */
-#define SAVE(a, b) \
- do { \
- INSIST(a == NULL); \
- a = b; \
- b = NULL; \
- } while (0)
-#define RESTORE(a, b) SAVE(a, b)
-
static atomic_uint_fast32_t last_rpznotready_log = 0;
static bool
INSIST(*rdatasetp == NULL ||
!dns_rdataset_isassociated(*rdatasetp));
st->state &= ~DNS_RPZ_RECURSING;
- RESTORE(*dbp, st->r.db);
+ *dbp = MOVE_OWNERSHIP(st->r.db);
if (*rdatasetp != NULL) {
ns_client_putrdataset(client, rdatasetp);
}
- RESTORE(*rdatasetp, st->r.r_rdataset);
+ *rdatasetp = MOVE_OWNERSHIP(st->r.r_rdataset);
result = st->r.r_result;
if (result == DNS_R_DELEGATION) {
CTRACE(ISC_LOG_ERROR, "RPZ recursing");
dns_name_copy(p_name, st->p_name);
st->m.prefix = prefix;
st->m.result = result;
- SAVE(st->m.zone, *zonep);
- SAVE(st->m.db, *dbp);
- SAVE(st->m.node, *nodep);
+ st->m.zone = MOVE_OWNERSHIP(*zonep);
+ st->m.db = MOVE_OWNERSHIP(*dbp);
+ st->m.node = MOVE_OWNERSHIP(*nodep);
if (*rdatasetp != NULL && dns_rdataset_isassociated(*rdatasetp)) {
/*
* Save the replacement rdataset from the policy
* and make the previous replacement rdataset scratch.
*/
- SAVE(trdataset, st->m.rdataset);
- SAVE(st->m.rdataset, *rdatasetp);
- SAVE(*rdatasetp, trdataset);
+ trdataset = MOVE_OWNERSHIP(st->m.rdataset);
+ st->m.rdataset = MOVE_OWNERSHIP(*rdatasetp);
+ *rdatasetp = MOVE_OWNERSHIP(trdataset);
st->m.ttl = ISC_MIN(st->m.rdataset->ttl, rpz->max_policy_ttl);
} else {
st->m.ttl = ISC_MIN(DNS_RPZ_TTL_DEFAULT, rpz->max_policy_ttl);
}
- SAVE(st->m.version, version);
+ st->m.version = MOVE_OWNERSHIP(version);
}
/*
{
for (i = 0; i < count; i++) {
if (aaaaok != NULL && !aaaaok[i]) {
- SAVE(client->query.dns64_aaaaok, aaaaok);
+ client->query.dns64_aaaaok =
+ MOVE_OWNERSHIP(aaaaok);
client->query.dns64_aaaaoklen = count;
break;
}
}
}
-/*
- * Call SAVE but set 'a' to NULL first so as not to assert.
- */
-#define INITANDSAVE(a, b) \
- do { \
- a = NULL; \
- SAVE(a, b); \
- } while (0)
-
/*
* "save" qctx data from 'src' to 'tgt'.
* It essentially moves ownership of the data from src to tgt, so the former
*target = *src;
/* Then "move" pointers (except client and view) */
- INITANDSAVE(target->dbuf, src->dbuf);
- INITANDSAVE(target->fname, src->fname);
- INITANDSAVE(target->tname, src->tname);
- INITANDSAVE(target->rdataset, src->rdataset);
- INITANDSAVE(target->sigrdataset, src->sigrdataset);
- INITANDSAVE(target->noqname, src->noqname);
- INITANDSAVE(target->fresp, src->fresp);
- INITANDSAVE(target->db, src->db);
- INITANDSAVE(target->version, src->version);
- INITANDSAVE(target->node, src->node);
- INITANDSAVE(target->zdb, src->zdb);
- INITANDSAVE(target->znode, src->znode);
- INITANDSAVE(target->zfname, src->zfname);
- INITANDSAVE(target->zversion, src->zversion);
- INITANDSAVE(target->zrdataset, src->zrdataset);
- INITANDSAVE(target->zsigrdataset, src->zsigrdataset);
- INITANDSAVE(target->rpz_st, src->rpz_st);
- INITANDSAVE(target->zone, src->zone);
+ target->dbuf = MOVE_OWNERSHIP(src->dbuf);
+ target->fname = MOVE_OWNERSHIP(src->fname);
+ target->tname = MOVE_OWNERSHIP(src->tname);
+ target->rdataset = MOVE_OWNERSHIP(src->rdataset);
+ target->sigrdataset = MOVE_OWNERSHIP(src->sigrdataset);
+ target->noqname = MOVE_OWNERSHIP(src->noqname);
+ target->fresp = MOVE_OWNERSHIP(src->fresp);
+ target->db = MOVE_OWNERSHIP(src->db);
+ target->version = MOVE_OWNERSHIP(src->version);
+ target->node = MOVE_OWNERSHIP(src->node);
+ target->zdb = MOVE_OWNERSHIP(src->zdb);
+ target->znode = MOVE_OWNERSHIP(src->znode);
+ target->zfname = MOVE_OWNERSHIP(src->zfname);
+ target->zversion = MOVE_OWNERSHIP(src->zversion);
+ target->zrdataset = MOVE_OWNERSHIP(src->zrdataset);
+ target->zsigrdataset = MOVE_OWNERSHIP(src->zsigrdataset);
+ target->rpz_st = MOVE_OWNERSHIP(src->rpz_st);
+ target->zone = MOVE_OWNERSHIP(src->zone);
/* View has to stay in 'src' for qctx_destroy. */
target->view = NULL;
dns_zone_detach(&qctx->zone);
qctx->zhooks = NULL;
}
- qctx->version = NULL;
- RESTORE(qctx->version, tversion);
- RESTORE(qctx->db, tdb);
- RESTORE(qctx->zone, tzone);
+ qctx->version = MOVE_OWNERSHIP(tversion);
+ qctx->db = MOVE_OWNERSHIP(tdb);
+ qctx->zone = MOVE_OWNERSHIP(tzone);
qctx->is_zone = true;
result = ISC_R_SUCCESS;
} else {
}
UNLOCK(&client->query.fetchlock);
- SAVE(fetch, resp->fetch);
+ fetch = MOVE_OWNERSHIP(resp->fetch);
/*
* We're done recursing, detach from quota and unlink from
qctx->is_zone = qctx->rpz_st->q.is_zone;
qctx->authoritative = qctx->rpz_st->q.authoritative;
- RESTORE(qctx->zone, qctx->rpz_st->q.zone);
- RESTORE(qctx->node, qctx->rpz_st->q.node);
- RESTORE(qctx->db, qctx->rpz_st->q.db);
- RESTORE(qctx->rdataset, qctx->rpz_st->q.rdataset);
- RESTORE(qctx->sigrdataset, qctx->rpz_st->q.sigrdataset);
+ qctx->zone = MOVE_OWNERSHIP(qctx->rpz_st->q.zone);
+ qctx->node = MOVE_OWNERSHIP(qctx->rpz_st->q.node);
+ qctx->db = MOVE_OWNERSHIP(qctx->rpz_st->q.db);
+ qctx->rdataset = MOVE_OWNERSHIP(qctx->rpz_st->q.rdataset);
+ qctx->sigrdataset = MOVE_OWNERSHIP(qctx->rpz_st->q.sigrdataset);
qctx->qtype = qctx->rpz_st->q.qtype;
if (qctx->fresp->node != NULL) {
dns_db_detachnode(&qctx->fresp->node);
}
- SAVE(qctx->rpz_st->r.db, qctx->fresp->cache);
+ qctx->rpz_st->r.db = MOVE_OWNERSHIP(qctx->fresp->cache);
qctx->rpz_st->r.r_type = qctx->fresp->qtype;
- SAVE(qctx->rpz_st->r.r_rdataset, qctx->fresp->rdataset);
+ qctx->rpz_st->r.r_rdataset =
+ MOVE_OWNERSHIP(qctx->fresp->rdataset);
ns_client_putrdataset(qctx->client, &qctx->fresp->sigrdataset);
} else if (REDIRECT(qctx->client)) {
/*
#endif /* ifdef WANT_QUERYTRACE */
qctx->qtype = qctx->client->query.redirect.qtype;
INSIST(qctx->client->query.redirect.rdataset != NULL);
- RESTORE(qctx->rdataset, qctx->client->query.redirect.rdataset);
- RESTORE(qctx->sigrdataset,
+ qctx->rdataset =
+ MOVE_OWNERSHIP(qctx->client->query.redirect.rdataset);
+ qctx->sigrdataset = MOVE_OWNERSHIP(
qctx->client->query.redirect.sigrdataset);
- RESTORE(qctx->db, qctx->client->query.redirect.db);
- RESTORE(qctx->node, qctx->client->query.redirect.node);
- RESTORE(qctx->zone, qctx->client->query.redirect.zone);
+ qctx->db = MOVE_OWNERSHIP(qctx->client->query.redirect.db);
+ qctx->node = MOVE_OWNERSHIP(qctx->client->query.redirect.node);
+ qctx->zone = MOVE_OWNERSHIP(qctx->client->query.redirect.zone);
qctx->authoritative =
qctx->client->query.redirect.authoritative;
qctx->authoritative = false;
qctx->qtype = qctx->fresp->qtype;
- SAVE(qctx->db, qctx->fresp->cache);
- SAVE(qctx->node, qctx->fresp->node);
- SAVE(qctx->rdataset, qctx->fresp->rdataset);
- SAVE(qctx->sigrdataset, qctx->fresp->sigrdataset);
+ qctx->db = MOVE_OWNERSHIP(qctx->fresp->cache);
+ qctx->node = MOVE_OWNERSHIP(qctx->fresp->node);
+ qctx->rdataset = MOVE_OWNERSHIP(qctx->fresp->rdataset);
+ qctx->sigrdataset = MOVE_OWNERSHIP(qctx->fresp->sigrdataset);
}
INSIST(qctx->rdataset != NULL);
canceled = true;
}
UNLOCK(&client->query.fetchlock);
- SAVE(hctx, rev->ctx);
+ hctx = MOVE_OWNERSHIP(rev->ctx);
release_recursionquota(client);
qctx->rpz_st->q.qtype = qctx->qtype;
qctx->rpz_st->q.is_zone = qctx->is_zone;
qctx->rpz_st->q.authoritative = qctx->authoritative;
- SAVE(qctx->rpz_st->q.zone, qctx->zone);
- SAVE(qctx->rpz_st->q.db, qctx->db);
- SAVE(qctx->rpz_st->q.node, qctx->node);
- SAVE(qctx->rpz_st->q.rdataset, qctx->rdataset);
- SAVE(qctx->rpz_st->q.sigrdataset, qctx->sigrdataset);
+ qctx->rpz_st->q.zone = MOVE_OWNERSHIP(qctx->zone);
+ qctx->rpz_st->q.db = MOVE_OWNERSHIP(qctx->db);
+ qctx->rpz_st->q.node = MOVE_OWNERSHIP(qctx->node);
+ qctx->rpz_st->q.rdataset = MOVE_OWNERSHIP(qctx->rdataset);
+ qctx->rpz_st->q.sigrdataset = MOVE_OWNERSHIP(qctx->sigrdataset);
dns_name_copy(qctx->fname, qctx->rpz_st->fname);
qctx->rpz_st->q.result = result;
qctx->client->query.attributes |= NS_QUERYATTR_RECURSING;
rpz_clean(&qctx->zone, &qctx->db, &qctx->node, NULL);
if (qctx->rpz_st->m.rdataset != NULL) {
ns_client_putrdataset(qctx->client, &qctx->rdataset);
- RESTORE(qctx->rdataset, qctx->rpz_st->m.rdataset);
+ qctx->rdataset =
+ MOVE_OWNERSHIP(qctx->rpz_st->m.rdataset);
} else {
qctx_clean(qctx);
}
qctx->version = NULL;
- RESTORE(qctx->node, qctx->rpz_st->m.node);
- RESTORE(qctx->db, qctx->rpz_st->m.db);
- RESTORE(qctx->version, qctx->rpz_st->m.version);
- RESTORE(qctx->zone, qctx->rpz_st->m.zone);
+ qctx->node = MOVE_OWNERSHIP(qctx->rpz_st->m.node);
+ qctx->db = MOVE_OWNERSHIP(qctx->rpz_st->m.db);
+ qctx->version = MOVE_OWNERSHIP(qctx->rpz_st->m.version);
+ qctx->zone = MOVE_OWNERSHIP(qctx->rpz_st->m.zone);
/*
* Add SOA record to additional section
* Look to see if there are A records for this name.
*/
qctx->client->query.dns64_ttl = qctx->rdataset->ttl;
- SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset);
- SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset);
+ qctx->client->query.dns64_aaaa = MOVE_OWNERSHIP(qctx->rdataset);
+ qctx->client->query.dns64_sigaaaa =
+ MOVE_OWNERSHIP(qctx->sigrdataset);
ns_client_releasename(qctx->client, &qctx->fname);
dns_db_detachnode(&qctx->node);
qctx->type = qctx->qtype = dns_rdatatype_a;
dns_zone_detach(&qctx->zone);
qctx->zhooks = NULL;
}
- qctx->version = NULL;
- RESTORE(qctx->version, tversion);
- RESTORE(qctx->db, tdb);
- RESTORE(qctx->zone, tzone);
+ qctx->version = MOVE_OWNERSHIP(tversion);
+ qctx->db = MOVE_OWNERSHIP(tdb);
+ qctx->zone = MOVE_OWNERSHIP(tzone);
qctx->authoritative = true;
return query_lookup(qctx);
* we'll restore these values there.
*/
ns_client_keepname(qctx->client, qctx->fname, qctx->dbuf);
- SAVE(qctx->zdb, qctx->db);
- SAVE(qctx->znode, qctx->node);
- SAVE(qctx->zfname, qctx->fname);
- SAVE(qctx->zversion, qctx->version);
- SAVE(qctx->zrdataset, qctx->rdataset);
- SAVE(qctx->zsigrdataset, qctx->sigrdataset);
+ qctx->zdb = MOVE_OWNERSHIP(qctx->db);
+ qctx->znode = MOVE_OWNERSHIP(qctx->node);
+ qctx->zfname = MOVE_OWNERSHIP(qctx->fname);
+ qctx->zversion = MOVE_OWNERSHIP(qctx->version);
+ qctx->zrdataset = MOVE_OWNERSHIP(qctx->rdataset);
+ qctx->zsigrdataset = MOVE_OWNERSHIP(qctx->sigrdataset);
dns_db_attach(qctx->view->cachedb, &qctx->db);
qctx->is_zone = false;
dns_db_detachnode(&qctx->node);
dns_db_detach(&qctx->db);
- RESTORE(qctx->db, qctx->zdb);
- RESTORE(qctx->node, qctx->znode);
- RESTORE(qctx->fname, qctx->zfname);
- RESTORE(qctx->version, qctx->zversion);
- RESTORE(qctx->rdataset, qctx->zrdataset);
- RESTORE(qctx->sigrdataset, qctx->zsigrdataset);
+ qctx->db = MOVE_OWNERSHIP(qctx->zdb);
+ qctx->node = MOVE_OWNERSHIP(qctx->znode);
+ qctx->fname = MOVE_OWNERSHIP(qctx->zfname);
+ qctx->version = MOVE_OWNERSHIP(qctx->zversion);
+ qctx->rdataset = MOVE_OWNERSHIP(qctx->zrdataset);
+ qctx->sigrdataset = MOVE_OWNERSHIP(qctx->zsigrdataset);
}
result = query_delegation_recurse(qctx);
if (qctx->sigrdataset != NULL) {
ns_client_putrdataset(qctx->client, &qctx->sigrdataset);
}
- RESTORE(qctx->rdataset, qctx->client->query.dns64_aaaa);
- RESTORE(qctx->sigrdataset, qctx->client->query.dns64_sigaaaa);
+ qctx->rdataset = MOVE_OWNERSHIP(qctx->client->query.dns64_aaaa);
+ qctx->sigrdataset =
+ MOVE_OWNERSHIP(qctx->client->query.dns64_sigaaaa);
if (qctx->fname == NULL) {
qctx->dbuf = ns_client_getnamebuf(qctx->client);
qctx->fname = ns_client_newname(qctx->client,
UNREACHABLE();
}
- SAVE(qctx->client->query.dns64_aaaa, qctx->rdataset);
- SAVE(qctx->client->query.dns64_sigaaaa, qctx->sigrdataset);
+ qctx->client->query.dns64_aaaa = MOVE_OWNERSHIP(qctx->rdataset);
+ qctx->client->query.dns64_sigaaaa =
+ MOVE_OWNERSHIP(qctx->sigrdataset);
ns_client_releasename(qctx->client, &qctx->fname);
dns_db_detachnode(&qctx->node);
qctx->type = qctx->qtype = dns_rdatatype_a;
case DNS_R_CONTINUE:
inc_stats(qctx->client,
ns_statscounter_nxdomainredirect_rlookup);
- SAVE(qctx->client->query.redirect.db, qctx->db);
- SAVE(qctx->client->query.redirect.node, qctx->node);
- SAVE(qctx->client->query.redirect.zone, qctx->zone);
+ qctx->client->query.redirect.db = MOVE_OWNERSHIP(qctx->db);
+ qctx->client->query.redirect.node = MOVE_OWNERSHIP(qctx->node);
+ qctx->client->query.redirect.zone = MOVE_OWNERSHIP(qctx->zone);
qctx->client->query.redirect.qtype = qctx->qtype;
INSIST(qctx->rdataset != NULL);
- SAVE(qctx->client->query.redirect.rdataset, qctx->rdataset);
- SAVE(qctx->client->query.redirect.sigrdataset,
- qctx->sigrdataset);
+ qctx->client->query.redirect.rdataset =
+ MOVE_OWNERSHIP(qctx->rdataset);
+ qctx->client->query.redirect.sigrdataset =
+ MOVE_OWNERSHIP(qctx->sigrdataset);
qctx->client->query.redirect.result = saved_result;
dns_name_copy(qctx->fname, qctx->client->query.redirect.fname);
qctx->client->query.redirect.authoritative =
if (USECACHE(client)) {
ns_client_keepname(client, fname, dbuf);
dns_db_detachnode(&node);
- SAVE(zdb, db);
- SAVE(zfname, fname);
- SAVE(zrdataset, rdataset);
- SAVE(zsigrdataset, sigrdataset);
+ zdb = MOVE_OWNERSHIP(db);
+ zfname = MOVE_OWNERSHIP(fname);
+ zrdataset = MOVE_OWNERSHIP(rdataset);
+ zsigrdataset = MOVE_OWNERSHIP(sigrdataset);
version = NULL;
dns_db_attach(client->inner.view->cachedb, &db);
is_zone = false;
}
dns_db_detach(&db);
- RESTORE(db, zdb);
- RESTORE(fname, zfname);
- RESTORE(rdataset, zrdataset);
- RESTORE(sigrdataset, zsigrdataset);
+ db = MOVE_OWNERSHIP(zdb);
+ fname = MOVE_OWNERSHIP(zfname);
+ rdataset = MOVE_OWNERSHIP(zrdataset);
+ sigrdataset = MOVE_OWNERSHIP(zsigrdataset);
}
/*