diff --git a/lib/ns/query.c b/lib/ns/query.c index da4943250c..7bfdeae169 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -8099,10 +8099,17 @@ query_respond(query_ctx_t *qctx) { query_addnoqnameproof(qctx); /* - * We shouldn't ever fail to add 'rdataset' - * because it's already in the answer. - */ - INSIST(qctx->rdataset == NULL || QUERY_ANSWERED(&qctx->client->query)); + * 'qctx->rdataset' will only be non-NULL here if the ANSWER section of + * the message to be sent to the client already contains an RRset with + * the same owner name and the same type as 'qctx->rdataset'. This + * should never happen, with one exception: when chasing DNAME records, + * one of the DNAME records placed in the ANSWER section may turn out + * to be the final answer to the client's query, but we have no way of + * knowing that until now. In such a case, 'qctx->rdataset' will be + * freed later, so we do not need to free it here. + */ + INSIST(qctx->rdataset == NULL || qctx->qtype == dns_rdatatype_dname || + QUERY_ANSWERED(&qctx->client->query)); query_addauth(qctx);