Previously, multiple code paths reused client->query.fetch, so it was
enough for ns_query_cancel() to issue a single call to
dns_resolver_cancelfetch() with that fetch as an argument. Now, since
each slot in the 'recursions' array can hold a reference to a separate
resolver fetch, ns_query_cancel() needs to handle all of them, so that
all recursion callbacks get a chance to clean up the associated
resources when a query is canceled.
REQUIRE(NS_CLIENT_VALID(client));
LOCK(&client->query.fetchlock);
- if (FETCH_RECTYPE_NORMAL(client) != NULL) {
- dns_resolver_cancelfetch(FETCH_RECTYPE_NORMAL(client));
- FETCH_RECTYPE_NORMAL(client) = NULL;
+ for (int i = 0; i < RECTYPE_COUNT; i++) {
+ dns_fetch_t **fetchp = &client->query.recursions[i].fetch;
+ if (*fetchp != NULL) {
+ dns_resolver_cancelfetch(*fetchp);
+ *fetchp = NULL;
+ }
}
if (client->query.hookactx != NULL) {
client->query.hookactx->cancel(client->query.hookactx);