mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 08:07:10 +02:00
BUG/MINOR: quic: idle timer task requeued in the past
When the idle timer expired with a still present mux, this task was not freed and even requeued with a timer in the past. Fix this issue calling task_destroy() in this case. As the task is freed, its handler must return NULL setting local <t> variable to NULL in every cases. Also ensure that this timer task is not armed again after having been released with a <return> statement when this is the case from qc_idle_timer_do_rearm(). Must be backported as far as 2.6.
This commit is contained in:
parent
b48abf0beb
commit
7ecf4b34b9
@ -1573,6 +1573,10 @@ void qc_idle_timer_do_rearm(struct quic_conn *qc, int arm_ack)
|
|||||||
{
|
{
|
||||||
unsigned int expire;
|
unsigned int expire;
|
||||||
|
|
||||||
|
/* It is possible the idle timer task has been already released. */
|
||||||
|
if (!qc->idle_timer_task)
|
||||||
|
return;
|
||||||
|
|
||||||
if (stopping && qc->flags & (QUIC_FL_CONN_CLOSING|QUIC_FL_CONN_DRAINING)) {
|
if (stopping && qc->flags & (QUIC_FL_CONN_CLOSING|QUIC_FL_CONN_DRAINING)) {
|
||||||
TRACE_PROTO("executing idle timer immediately on stopping", QUIC_EV_CONN_IDLE_TIMER, qc);
|
TRACE_PROTO("executing idle timer immediately on stopping", QUIC_EV_CONN_IDLE_TIMER, qc);
|
||||||
qc->ack_expire = TICK_ETERNITY;
|
qc->ack_expire = TICK_ETERNITY;
|
||||||
@ -1685,8 +1689,13 @@ struct task *qc_idle_timer_task(struct task *t, void *ctx, unsigned int state)
|
|||||||
if (qc->mux_state != QC_MUX_READY) {
|
if (qc->mux_state != QC_MUX_READY) {
|
||||||
quic_conn_release(qc);
|
quic_conn_release(qc);
|
||||||
qc = NULL;
|
qc = NULL;
|
||||||
t = NULL;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
task_destroy(t);
|
||||||
|
qc->idle_timer_task = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
t = NULL;
|
||||||
|
|
||||||
/* TODO if the quic-conn cannot be freed because of the MUX, we may at
|
/* TODO if the quic-conn cannot be freed because of the MUX, we may at
|
||||||
* least clean some parts of it such as the tasklet.
|
* least clean some parts of it such as the tasklet.
|
||||||
|
Loading…
Reference in New Issue
Block a user