summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/evaluate.c12
-rw-r--r--src/intervals.c2
-rw-r--r--tests/shell/testcases/bogons/nft-f/same_set_name_but_different_keys_assert13
3 files changed, 26 insertions, 1 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index fc9d82f7..a2d5d7c2 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -5304,6 +5304,18 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
if (set_is_interval(set->flags) && !set_is_interval(existing_set->flags))
return set_error(ctx, set,
"existing %s lacks interval flag", type);
+ if (set->data && existing_set->data &&
+ !datatype_equal(existing_set->data->dtype, set->data->dtype))
+ return set_error(ctx, set,
+ "%s already exists with different datatype (%s vs %s)",
+ type, existing_set->data->dtype->desc,
+ set->data->dtype->desc);
+ if (!datatype_equal(existing_set->key->dtype, set->key->dtype))
+ return set_error(ctx, set,
+ "%s already exists with different datatype (%s vs %s)",
+ type, existing_set->key->dtype->desc,
+ set->key->dtype->desc);
+ /* Catch attempt to merge set and map */
if (!set_type_compatible(set, existing_set))
return set_error(ctx, set, "Cannot merge %s with incompatible existing %s of same name",
type,
diff --git a/src/intervals.c b/src/intervals.c
index bf125a0c..e5bbb038 100644
--- a/src/intervals.c
+++ b/src/intervals.c
@@ -70,7 +70,7 @@ static void setelem_expr_to_range(struct expr *expr)
expr->key = key;
break;
default:
- BUG("unhandled key type %d\n", expr->key->etype);
+ BUG("unhandled key type %s\n", expr_name(expr->key));
}
}
diff --git a/tests/shell/testcases/bogons/nft-f/same_set_name_but_different_keys_assert b/tests/shell/testcases/bogons/nft-f/same_set_name_but_different_keys_assert
new file mode 100644
index 00000000..8fcfdf5c
--- /dev/null
+++ b/tests/shell/testcases/bogons/nft-f/same_set_name_but_different_keys_assert
@@ -0,0 +1,13 @@
+table ip t {
+ set s4 {
+ type ipv4_addr . iface_index
+ flags interval
+ elements = { 127.0.0.1 . "lo" }
+ }
+
+ set s4 {
+ type iface_index
+ flags interval
+ elements = { "lo" }
+ }
+}