From 1907ccc2f75b78ace1ee4acdfc60d48a76e3decd Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 29 Apr 2019 13:12:02 +0200 Subject: [PATCH] BUG/MINOR: http: Call stream_inc_be_http_req_ctr() only one time per request The function stream_inc_be_http_req_ctr() is called at the beginning of the analysers AN_REQ_HTTP_PROCESS_FE/BE. It as an effect only on the backend. But we must be careful to call it only once. If the processing of HTTP rules is interrupted in the middle, when the analyser is resumed, we must not call it again. Otherwise, the tracked counters of the backend are incremented several times. This bug was reported in github. See issue #74. This fix should be backported as far as 1.6. --- src/proto_http.c | 6 ++++-- src/proto_htx.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index 5776a4784..2ab331542 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2533,8 +2533,10 @@ int http_process_req_common(struct stream *s, struct channel *req, int an_bit, s ci_data(req), req->analysers); - /* just in case we have some per-backend tracking */ - stream_inc_be_http_req_ctr(s); + /* just in case we have some per-backend tracking. Only called the first + * execution of the analyser. */ + if (!s->current_rule || s->current_rule_list != &px->http_req_rules) + stream_inc_be_http_req_ctr(s); /* evaluate http-request rules */ if (!LIST_ISEMPTY(&px->http_req_rules)) { diff --git a/src/proto_htx.c b/src/proto_htx.c index d2c03e180..ee9a2716f 100644 --- a/src/proto_htx.c +++ b/src/proto_htx.c @@ -501,8 +501,10 @@ int htx_process_req_common(struct stream *s, struct channel *req, int an_bit, st htx = htxbuf(&req->buf); - /* just in case we have some per-backend tracking */ - stream_inc_be_http_req_ctr(s); + /* just in case we have some per-backend tracking. Only called the first + * execution of the analyser. */ + if (!s->current_rule || s->current_rule_list != &px->http_req_rules) + stream_inc_be_http_req_ctr(s); /* evaluate http-request rules */ if (!LIST_ISEMPTY(&px->http_req_rules)) {