From: Frédéric Lécaille Date: Wed, 7 Aug 2019 07:28:39 +0000 (+0200) Subject: BUG/MEDIUM: stick-table: Wrong stick-table backends parsing. X-Git-Tag: v2.1-dev2~226 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be36793d1d86fc090abcdd90aa191a50267c3c38;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: stick-table: Wrong stick-table backends parsing. When parsing references to stick-tables declared as backends, they are added to a list of proxies (they are proxies!) which refer to this stick-tables. Before this patch we added them to these list without checking they were already present, making the silly hypothesis the actions/sample were checked/resolved in the same order the proxies are parsed. This patch implement a simple inline function to in_proxies_list() to test the presence of a proxy in a list of proxies. We use this function when resolving /checking samples/actions. This bug was introduced by 015e4d7 commit. Must be backported to 2.0. --- diff --git a/include/proto/proxy.h b/include/proto/proxy.h index c75c0da21e..558718ba23 100644 --- a/include/proto/proxy.h +++ b/include/proto/proxy.h @@ -184,6 +184,21 @@ static inline int l7_status_match(struct proxy *p, int status) } return 0; } + +/* Return 1 if

proxy is in list of proxies which are also stick-tables, + * 0 if not. + */ +static inline int in_proxies_list(struct proxy *list, struct proxy *proxy) +{ + struct proxy *p; + + for (p = list; p; p = p->next_stkt_ref) + if (proxy == p) + return 1; + + return 0; +} + #endif /* _PROTO_PROXY_H */ /* diff --git a/src/action.c b/src/action.c index 54542420cf..76842022c8 100644 --- a/src/action.c +++ b/src/action.c @@ -56,7 +56,7 @@ int check_trk_action(struct act_rule *rule, struct proxy *px, char **err) return 0; } else { - if (target->proxies_list != px) { + if (!in_proxies_list(target->proxies_list, px)) { px->next_stkt_ref = target->proxies_list; target->proxies_list = px; } diff --git a/src/sample.c b/src/sample.c index 94c605f927..6327b6b08d 100644 --- a/src/sample.c +++ b/src/sample.c @@ -1274,7 +1274,7 @@ int smp_resolve_args(struct proxy *p) break; } - if (t->proxies_list != p) { + if (!in_proxies_list(t->proxies_list, p)) { p->next_stkt_ref = t->proxies_list; t->proxies_list = p; }