From be36793d1d86fc090abcdd90aa191a50267c3c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Wed, 7 Aug 2019 09:28:39 +0200 Subject: [PATCH] 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. --- include/proto/proxy.h | 15 +++++++++++++++ src/action.c | 2 +- src/sample.c | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/proto/proxy.h b/include/proto/proxy.h index c75c0da21..558718ba2 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 54542420c..76842022c 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 94c605f92..6327b6b08 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; }