isc_stdtime_t now, uint32_t lifetime) {
isc_result_t result = ISC_R_SUCCESS;
dns__nta_t *nta = NULL;
+ dns__nta_t *old_nta = NULL;
dns_qp_t *qp = NULL;
- void *pval = NULL;
REQUIRE(VALID_NTATABLE(ntatable));
result = dns_qp_insert(qp, nta, 0);
switch (result) {
case ISC_R_EXISTS:
- result = dns_qp_getname(qp, &nta->name, &pval, NULL);
- if (result == ISC_R_SUCCESS) {
- /*
- * an NTA already existed: throw away the
- * new one and update the old one.
- */
- dns__nta_detach(&nta); /* for nta_create */
- nta = pval;
- break;
- }
- /* update the NTA's timer as if it were new */
+ result = dns_qp_deletename(qp, name, (void *)&old_nta, NULL);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
+ dns__nta_shutdown(old_nta);
+ dns__nta_detach(&old_nta);
+
+ result = dns_qp_insert(qp, nta, 0);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
FALLTHROUGH;
case ISC_R_SUCCESS:
nta->expiry = now + lifetime;
RWLOCK(&ntatable->rwlock, isc_rwlocktype_write);
dns_qpmulti_write(ntatable->table, &qp);
result = dns_qp_getname(qp, &nta->name, &pval, NULL);
- if (result == ISC_R_SUCCESS &&
- ((dns__nta_t *)pval)->expiry == nta->expiry && !nta->shuttingdown)
- {
+ if (result == ISC_R_SUCCESS && pval == nta && !nta->shuttingdown) {
char nb[DNS_NAME_FORMATSIZE];
dns_name_format(&nta->name, nb, sizeof(nb));
isc_log_write(dns_lctx, DNS_LOGCATEGORY_DNSSEC,