mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-28 22:31:06 +01:00
MEDIUM: pattern: ensure that sample types always cast into other types.
We want to ensure that a dynamically returned type will always have a cast before calling the cast function. This is done in pattern_process() and in stktable_fetch_key().
This commit is contained in:
parent
25c1ebc0c9
commit
12e5011a76
@ -487,9 +487,21 @@ struct sample *pattern_process(struct proxy *px, struct session *l4, void *l7,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
list_for_each_entry(conv_expr, &expr->conv_exprs, list) {
|
list_for_each_entry(conv_expr, &expr->conv_exprs, list) {
|
||||||
if (!pattern_casts[p->type][conv_expr->conv->in_type](p))
|
/* we want to ensure that p->type can be casted into
|
||||||
|
* conv_expr->conv->in_type. We have 3 possibilities :
|
||||||
|
* - NULL => not castable.
|
||||||
|
* - c_none => nothing to do (let's optimize it)
|
||||||
|
* - other => apply cast and prepare to fail
|
||||||
|
*/
|
||||||
|
if (!pattern_casts[p->type][conv_expr->conv->in_type])
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (pattern_casts[p->type][conv_expr->conv->in_type] != c_none &&
|
||||||
|
!pattern_casts[p->type][conv_expr->conv->in_type](p))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* OK cast succeeded */
|
||||||
|
|
||||||
/* force the output type after a cast */
|
/* force the output type after a cast */
|
||||||
p->type = conv_expr->conv->in_type;
|
p->type = conv_expr->conv->in_type;
|
||||||
if (!conv_expr->conv->process(conv_expr->arg_p, p))
|
if (!conv_expr->conv->process(conv_expr->arg_p, p))
|
||||||
|
|||||||
@ -600,6 +600,9 @@ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, st
|
|||||||
if (!smp)
|
if (!smp)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!pattern_to_key[smp->type][t->type])
|
||||||
|
return NULL;
|
||||||
|
|
||||||
static_table_key.key_len = t->key_size;
|
static_table_key.key_len = t->key_size;
|
||||||
static_table_key.key = pattern_to_key[smp->type][t->type](smp, &static_table_key.data, &static_table_key.key_len);
|
static_table_key.key = pattern_to_key[smp->type][t->type](smp, &static_table_key.data, &static_table_key.key_len);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user