detach fetchhandle before resume query processing

otherwise, another hook async event or DNS recursion would
trigger an assertion failure.
This commit is contained in:
JINMEI Tatuya 2020-12-11 21:44:54 -08:00 committed by Evan Hunt
parent 5a05cbebc4
commit d520f01c7b
2 changed files with 15 additions and 2 deletions

View file

@ -6349,6 +6349,15 @@ query_hookresume(isc_task_t *task, isc_event_t *event) {
ISC_LIST_UNLINK(client->manager->recursing, client, rlink);
}
UNLOCK(&client->manager->reclock);
/*
* This event is running under a client task, so it's safe to detach
* the fetch handle. And it should be done before resuming query
* processing below, since that may trigger another recursion or
* asynchronous hook event.
*/
isc_nmhandle_detach(&client->fetchhandle);
client->state = NS_CLIENTSTATE_WORKING;
if (canceled) {
@ -6450,7 +6459,6 @@ query_hookresume(isc_task_t *task, isc_event_t *event) {
qctx_destroy(qctx);
isc_mem_put(client->mctx, qctx, sizeof(*qctx));
isc_event_free(&event);
isc_nmhandle_detach(&client->fetchhandle);
}
isc_result_t

View file

@ -717,7 +717,12 @@ hook_recurse_common(void *arg, void *data, isc_result_t *resultp,
asdata->async = true;
}
} else {
/* Resume from the completion of recursion */
/*
* Resume from the completion of async event.
* fetchhandle should have been detached so that we can start
* another async event or DNS recursive resolution.
*/
INSIST(qctx->client->fetchhandle == NULL);
asdata->async = false;
switch (hookpoint) {
case NS_QUERY_GOT_ANSWER_BEGIN: