The ACT_OPT_FINAL flag was not properly handled in the pause action. When
this flag is set, because of an abort or an unexpected error, an action must
no longer yield. However, in the pause action, this flag was never tested.
In case of client abort for instance, this could trigger an internal error
instead of a client error.
This patch should fix the issue #3403. It must be backported as far as 3.2.
struct channel *chn = ((rule->from == ACT_F_HTTP_REQ) ? &s->req : &s->res);
struct sample *key;
+ if (flags & ACT_OPT_FINAL)
+ goto end;
+
if (!tick_isset(chn->analyse_exp)) {
int time;
if (tick_isset(chn->analyse_exp) && !tick_is_expired(chn->analyse_exp, now_ms))
return ACT_RET_YIELD;
+ end:
chn->analyse_exp = TICK_ETERNITY;
return ACT_RET_CONT;
}