mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-29 14:50:59 +01:00
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.
This commit is contained in:
parent
5488a62bfb
commit
be36793d1d
@ -184,6 +184,21 @@ static inline int l7_status_match(struct proxy *p, int status)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return 1 if <p> proxy is in <list> 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 */
|
#endif /* _PROTO_PROXY_H */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -56,7 +56,7 @@ int check_trk_action(struct act_rule *rule, struct proxy *px, char **err)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (target->proxies_list != px) {
|
if (!in_proxies_list(target->proxies_list, px)) {
|
||||||
px->next_stkt_ref = target->proxies_list;
|
px->next_stkt_ref = target->proxies_list;
|
||||||
target->proxies_list = px;
|
target->proxies_list = px;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1274,7 +1274,7 @@ int smp_resolve_args(struct proxy *p)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->proxies_list != p) {
|
if (!in_proxies_list(t->proxies_list, p)) {
|
||||||
p->next_stkt_ref = t->proxies_list;
|
p->next_stkt_ref = t->proxies_list;
|
||||||
t->proxies_list = p;
|
t->proxies_list = p;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user