diff --git a/include/proto/stick_table.h b/include/proto/stick_table.h index 0c26fbea3..57ca22343 100644 --- a/include/proto/stick_table.h +++ b/include/proto/stick_table.h @@ -48,7 +48,7 @@ struct stksess *stktable_lookup_key(struct stktable *t, struct stktable_key *key struct stksess *stktable_update_key(struct stktable *table, struct stktable_key *key); struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, struct session *l4, void *l7, unsigned int opt, - struct sample_expr *expr); + struct sample_expr *expr, struct sample *smp); int stktable_compatible_sample(struct sample_expr *expr, unsigned long table_type); int stktable_get_data_type(char *name); struct proxy *find_stktable(const char *name); diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 65c4fdad3..1aac0d922 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -1027,7 +1027,7 @@ int tcp_inspect_request(struct session *s, struct channel *req, int an_bit) continue; t = rule->act_prm.trk_ctr.table.t; - key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr); + key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr, NULL); if (key && (ts = stktable_get_entry(t, key))) { session_track_stkctr(&s->stkctr[tcp_trk_idx(rule->action)], t, ts); @@ -1228,7 +1228,7 @@ int tcp_exec_req_rules(struct session *s) continue; t = rule->act_prm.trk_ctr.table.t; - key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr); + key = stktable_fetch_key(t, s->be, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->act_prm.trk_ctr.expr, NULL); if (key && (ts = stktable_get_entry(t, key))) session_track_stkctr(&s->stkctr[tcp_trk_idx(rule->action)], t, ts); diff --git a/src/session.c b/src/session.c index e26f5ad17..df85170cd 100644 --- a/src/session.c +++ b/src/session.c @@ -1458,7 +1458,7 @@ static int process_sticking_rules(struct session *s, struct channel *req, int an if (ret) { struct stktable_key *key; - key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->expr); + key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->expr, NULL); if (!key) continue; @@ -1561,7 +1561,7 @@ static int process_store_rules(struct session *s, struct channel *rep, int an_bi if (ret) { struct stktable_key *key; - key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_RES|SMP_OPT_FINAL, rule->expr); + key = stktable_fetch_key(rule->table.t, px, s, &s->txn, SMP_OPT_DIR_RES|SMP_OPT_FINAL, rule->expr, NULL); if (!key) continue; diff --git a/src/stick_table.c b/src/stick_table.c index c6463ec7b..a708d3c53 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -601,15 +601,17 @@ static sample_to_key_fct sample_to_key[SMP_TYPES][STKTABLE_TYPES] = { * Process a fetch + format conversion as defined by the sample expression * on request or response considering the parameter. Returns either NULL if * no key could be extracted, or a pointer to the converted result stored in - * static_table_key in format . + * static_table_key in format . If is not NULL, it will be reset + * and its flags will be initialized so that the caller gets a copy of the input + * sample, and knows why it was not accepted (eg: SMP_F_MAY_CHANGE is present). */ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, struct session *l4, void *l7, - unsigned int opt, - struct sample_expr *expr) + unsigned int opt, struct sample_expr *expr, struct sample *smp) { - struct sample *smp; + if (smp) + memset(smp, 0, sizeof(*smp)); - smp = sample_process(px, l4, l7, opt, expr, NULL); + smp = sample_process(px, l4, l7, opt, expr, smp); if (!smp) return NULL;