From: Jerome Magnin Date: Sat, 9 Nov 2019 17:00:47 +0000 (+0100) Subject: BUG/MINOR: stream: init variables when the list is empty X-Git-Tag: v2.1-dev5~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f44e8843a553ef0f9c53c9b27899727de097777;p=thirdparty%2Fhaproxy.git BUG/MINOR: stream: init variables when the list is empty We need to call vars_init() when the list is empty otherwise we can't use variables in the response scope. This regression was introduced by cda7f3f5 (MINOR: stream: don't prune variables if the list is empty). The following config reproduces the issue: defaults mode http frontend in bind *:11223 http-request set-var(req.foo) str("foo") if { path /bar } http-request set-header bar %[var(req.foo)] if { var(req.foo) -m found } http-response set-var(res.bar) str("bar") http-response set-header foo %[var(res.bar)] if { var(res.bar) -m found } use_backend out backend out server s1 127.0.0.1:11224 listen back bind *:11224 http-request deny deny_status 200 > GET /ba HTTP/1.1 > Host: localhost:11223 > User-Agent: curl/7.66.0 > Accept: */* > < HTTP/1.0 200 OK < Cache-Control: no-cache < Content-Type: text/html > GET /bar HTTP/1.1 > Host: localhost:11223 > User-Agent: curl/7.66.0 > Accept: */* > < HTTP/1.0 200 OK < Cache-Control: no-cache < Content-Type: text/html < foo: bar This must be backported as far as 1.9. --- diff --git a/src/stream.c b/src/stream.c index be9a9fabe3..535bf6a76e 100644 --- a/src/stream.c +++ b/src/stream.c @@ -2581,10 +2581,9 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) if (si_state_in(si_b->state, SI_SB_REQ|SI_SB_QUE|SI_SB_TAR|SI_SB_ASS)) { /* prune the request variables and swap to the response variables. */ if (s->vars_reqres.scope != SCOPE_RES) { - if (!LIST_ISEMPTY(&s->vars_reqres.head)) { + if (!LIST_ISEMPTY(&s->vars_reqres.head)) vars_prune(&s->vars_reqres, s->sess, s); - vars_init(&s->vars_reqres, SCOPE_RES); - } + vars_init(&s->vars_reqres, SCOPE_RES); } do {