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().
diff --git a/src/pattern.c b/src/pattern.c
index f6afb97..2820cf6 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -487,9 +487,21 @@
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))
diff --git a/src/stick_table.c b/src/stick_table.c
index 7bff124..a6ae3a2 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -600,6 +600,9 @@
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);