#define NTA_MAGIC ISC_MAGIC('N', 'T', 'A', 'n')
#define VALID_NTA(nn) ISC_MAGIC_VALID(nn, NTA_MAGIC)
+/*
+ * Obtain a reference to the nta object. Released by
+ * nta_detach.
+ */
+static void
+nta_ref(dns_nta_t *nta) {
+ isc_refcount_increment(&nta->refcount, NULL);
+}
+
static void
nta_detach(isc_mem_t *mctx, dns_nta_t **ntap) {
unsigned int refs;
dns_nta_t *nta = devent->ev_arg;
isc_result_t eresult = devent->result;
dns_ntatable_t *ntatable = nta->ntatable;
+ dns_view_t *view = ntatable->view;
isc_stdtime_t now;
UNUSED(task);
if (nta->timer != NULL && nta->expiry - now < ntatable->recheck)
(void) isc_timer_reset(nta->timer, isc_timertype_inactive,
NULL, NULL, ISC_TRUE);
+ nta_detach(view->mctx, &nta);
}
static void
dns_nta_t *nta = event->ev_arg;
dns_ntatable_t *ntatable = nta->ntatable;
dns_view_t *view = ntatable->view;
+ isc_result_t result;
if (nta->fetch != NULL) {
dns_resolver_cancelfetch(nta->fetch);
isc_event_free(&event);
- (void)dns_resolver_createfetch(view->resolver, nta->name,
- dns_rdatatype_nsec,
- NULL, NULL, NULL,
- DNS_FETCHOPT_NONTA,
- task, fetch_done, nta,
- &nta->rdataset,
- &nta->sigrdataset,
- &nta->fetch);
+ nta_ref(nta);
+ result = dns_resolver_createfetch(view->resolver, nta->name,
+ dns_rdatatype_nsec,
+ NULL, NULL, NULL,
+ DNS_FETCHOPT_NONTA,
+ task, fetch_done, nta,
+ &nta->rdataset,
+ &nta->sigrdataset,
+ &nta->fetch);
+ if (result != ISC_R_SUCCESS)
+ nta_detach(view->mctx, &nta);
}
static isc_result_t