]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: error out when existing set has incompatible key
authorFlorian Westphal <fw@strlen.de>
Wed, 13 Dec 2023 16:29:50 +0000 (17:29 +0100)
committerFlorian Westphal <fw@strlen.de>
Wed, 13 Dec 2023 17:11:10 +0000 (18:11 +0100)
Before:
BUG: invalid range expression type symbol
nft: expression.c:1494: range_expr_value_high: Assertion `0' failed.

After:
range_expr_value_high_assert:5:20-27: Error: Could not resolve protocol name
                elements = { 100-11.0.0.0, }
                                 ^^^^^^^^
range_expr_value_high_assert:7:6-7: Error: set definition has conflicting key (ipv4_addr vs inet_proto)

Signed-off-by: Florian Westphal <fw@strlen.de>
src/evaluate.c
tests/shell/testcases/bogons/nft-f/range_expr_value_high_assert [new file with mode: 0644]

index da382912ea71424b7f3fdecfe69116ebc400c8d3..8173d1537396d99f2dce39936f002ee4bf3dca25 100644 (file)
@@ -4761,6 +4761,9 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                existing_set = set_cache_find(table, set->handle.set.name);
                if (!existing_set)
                        set_cache_add(set_get(set), table);
+               else if (!datatype_equal(existing_set->key->dtype, set->key->dtype))
+                       return set_error(ctx, set, "%s definition has conflicting key (%s vs %s)\n",
+                                        type, set->key->dtype->name, existing_set->key->dtype->name);
 
                if (existing_set && existing_set->flags & NFT_SET_EVAL) {
                        uint32_t existing_flags = existing_set->flags & ~NFT_SET_EVAL;
diff --git a/tests/shell/testcases/bogons/nft-f/range_expr_value_high_assert b/tests/shell/testcases/bogons/nft-f/range_expr_value_high_assert
new file mode 100644 (file)
index 0000000..a25ac02
--- /dev/null
@@ -0,0 +1,12 @@
+table inet t {
+       set s3 {
+               type inet_proto
+               flags interval
+               elements = { 100-11.0.0.0, }
+       }
+       set s3 {
+               type ipv4_addr
+               flags interval
+               elements = { 100-11.0.0.0, }
+       }
+}