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:
Willy Tarreau 2012-04-25 17:21:49 +02:00
parent 25c1ebc0c9
commit 12e5011a76
2 changed files with 16 additions and 1 deletions

View File

@ -487,9 +487,21 @@ struct sample *pattern_process(struct proxy *px, struct session *l4, void *l7,
return NULL;
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;
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 */
p->type = conv_expr->conv->in_type;
if (!conv_expr->conv->process(conv_expr->arg_p, p))

View File

@ -600,6 +600,9 @@ struct stktable_key *stktable_fetch_key(struct stktable *t, struct proxy *px, st
if (!smp)
return NULL;
if (!pattern_to_key[smp->type][t->type])
return NULL;
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);