From: Willy Tarreau Date: Thu, 5 Dec 2013 01:19:58 +0000 (+0100) Subject: BUG/MEDIUM: acl: fix regression introduced by latest converters support X-Git-Tag: v1.5-dev20~163 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67ff7e0af37d093dbceb56a353d84fa4ffd10a7e;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: acl: fix regression introduced by latest converters support Since commit 348971e (MEDIUM: acl: use the fetch syntax 'fetch(args),conv(),conv()' into the ACL keyword), ACLs wait on input that may change. This is visible in the configuration below : tcp-request inspect-delay 3s tcp-request content accept if REQ_CONTENT Nothing will pass before the end of the timer. This is because historically, sample_process() was dedicated to stick tables where it was absolutely necessary to wait for a stable sample. Now samples are used by many other things and we can't afford this. So let's move this check to the stick tables after the call to sample_process() instead. This is post-1.5-dev19 work, no backport is required. --- diff --git a/src/sample.c b/src/sample.c index 10749c0e24..4253dd15ee 100644 --- a/src/sample.c +++ b/src/sample.c @@ -839,9 +839,6 @@ struct sample *sample_process(struct proxy *px, struct session *l4, void *l7, if (!expr->fetch->process(px, l4, l7, opt, expr->arg_p, p, expr->fetch->kw)) return NULL; - if ((p->flags & SMP_F_MAY_CHANGE) && !(opt & SMP_OPT_FINAL)) - return NULL; /* we can only use stable samples */ - list_for_each_entry(conv_expr, &expr->conv_exprs, list) { /* we want to ensure that p->type can be casted into * conv_expr->conv->in_type. We have 3 possibilities : diff --git a/src/stick_table.c b/src/stick_table.c index 45e6118fec..9a3e855a13 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -615,6 +615,9 @@ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, st if (!smp) return NULL; + if ((smp->flags & SMP_F_MAY_CHANGE) && !(opt & SMP_OPT_FINAL)) + return NULL; /* we can only use stable samples */ + if (!sample_to_key[smp->type][t->type]) return NULL;