From 82d723dd8e7f6b260fc980949161b1d2ec7bad11 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Thu, 7 May 2026 13:14:16 +0200 Subject: [PATCH] BUG/MEDIUM: tasks: Keep the TASK_RUNNING flag until queued In task_schedule(), it is not enough to get the TASK_RUNNING flag before setting the expire field, we also have to keep it while queueing the taks, otherwise the task may run in the meanwhile and set expire to 0, triggering the BUG_ON() in __task_queue() again. So now, only drop the running flag once it's done. This should be backported up to 2.8. --- include/haproxy/task.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/haproxy/task.h b/include/haproxy/task.h index 02d98156b..419d7749f 100644 --- a/include/haproxy/task.h +++ b/include/haproxy/task.h @@ -736,7 +736,6 @@ static inline void _task_schedule(struct task *task, int when, const struct ha_c when = tick_first(when, task->expire); task->expire = when; - task_drop_running(task, 0); if (!task_in_wq(task) || tick_is_lt(task->expire, task->wq.key)) { if (likely(caller)) { caller = HA_ATOMIC_XCHG(&task->caller, caller); @@ -747,6 +746,7 @@ static inline void _task_schedule(struct task *task, int when, const struct ha_c } __task_queue(task, &tg_ctx->timers); } + task_drop_running(task, 0); HA_RWLOCK_WRUNLOCK(TASK_WQ_LOCK, &wq_lock); } else #endif -- 2.47.3