Clear dns64_aaaaok immediately after use

The DNS64 state information stored in client->query.dns64_aaaaok
could cause an assertion failure in query_respond() if the server
was configured in such a way as to trigger a new recursion before
the query had been reset - for example, by using the filter-aaaa
plugin, which may need to recurse to find out whether an A record
exists.

This has been addressed by clearing DNS64 state information
immediately after the call to query_filter64().

(cherry picked from commit 7213b038f0)
This commit is contained in:
Evan Hunt 2026-05-03 22:00:39 -07:00 committed by Ondřej Surý
parent ab3d96b3e3
commit c17cc4fa7a
No known key found for this signature in database
GPG key ID: 2820F37E873DEA41
2 changed files with 7 additions and 4 deletions

View file

@ -23,9 +23,9 @@ options {
dnssec-validation no;
notify yes;
dns64 64:ff9b::/96 {
clients { any; };
exclude { any; };
mapped { any; };
clients { any; };
exclude { ::1/128; };
mapped { any; };
};
minimal-responses no;
};

View file

@ -716,7 +716,6 @@ query_reset(ns_client_t *client, bool everything) {
if (client->query.dns64_aaaaok != NULL) {
isc_mem_put(client->mctx, client->query.dns64_aaaaok,
client->query.dns64_aaaaoklen * sizeof(bool));
client->query.dns64_aaaaok = NULL;
client->query.dns64_aaaaoklen = 0;
}
@ -8331,6 +8330,10 @@ query_addanswer(query_ctx_t *qctx) {
} else if (qctx->client->query.dns64_aaaaok != NULL) {
query_filter64(qctx);
ns_client_putrdataset(qctx->client, &qctx->rdataset);
isc_mem_put(qctx->client->mctx,
qctx->client->query.dns64_aaaaok,
qctx->client->query.dns64_aaaaoklen * sizeof(bool));
qctx->client->query.dns64_aaaaoklen = 0;
} else {
if (!qctx->is_zone && RECURSIONOK(qctx->client) &&
!QUERY_STALETIMEOUT(&qctx->client->query))