[9.18] fix: dev: Don't loop indefinitely when isc_task quantum is 'unlimited'

Don't run more events than already scheduled.  If the quantum is set to
a high value, the task_run() would execute already scheduled, and all
new events that result from running event->ev_action().

Setting quantum to a number of scheduled events will postpone events
scheduled after we enter the loop here to the next task_run()
invocation.

Merge branch 'ondrej/dont-run-more-events-than-scheduled-9.18' into 'bind-9.18'

See merge request isc-projects/bind9!9257
This commit is contained in:
Ondřej Surý 2024-08-07 06:32:42 +00:00
commit 674420df64

View file

@ -793,6 +793,18 @@ task_run(isc_task_t *task) {
LOCK(&task->lock);
quantum = task->quantum;
/*
* Don't run more events than already scheduled. If the quantum is set
* to a high value, the following code would execute already scheduled,
* and all events that result from running event->ev_action(). Setting
* quantum to a number of scheduled events will postpone events
* scheduled after we enter the loop here to the next task_run()
* invocation.
*/
if (quantum > task->nevents) {
quantum = task->nevents;
}
if (task->state != task_state_ready) {
goto done;
}