]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: move interval flag compat check after set key evaluation
authorFlorian Westphal <fw@strlen.de>
Mon, 17 Mar 2025 11:56:36 +0000 (12:56 +0100)
committerFlorian Westphal <fw@strlen.de>
Tue, 18 Mar 2025 13:25:31 +0000 (14:25 +0100)
Without this, included bogon asserts with:
BUG: unhandled key type 13
nft: src/intervals.c:73: setelem_expr_to_range: Assertion `0' failed.

... because we no longer evaluate set->key/data.

Move the check to the tail of the function, right before assiging
set->existing_set, so that set->key has been evaluated.

Fixes: ceab53cee499 ("evaluate: don't allow merging interval set/map with non-interval one")
Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
tests/shell/testcases/bogons/nft-f/invalid_data_expr_type_range_value_2_assert [new file with mode: 0644]

index d59993dcdd4e9b5ef73d9b42ad9060f57901333f..f1f7ddaab991ab29bdb77352fb8f532cef4d5356 100644 (file)
@@ -5088,9 +5088,6 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                                if (existing_flags == new_flags)
                                        set->flags |= NFT_SET_EVAL;
                        }
-
-                       if (set_is_interval(set->flags) && !set_is_interval(existing_set->flags))
-                               return set_error(ctx, set, "existing %s lacks interval flag", type);
                } else {
                        set_cache_add(set_get(set), table);
                }
@@ -5181,6 +5178,9 @@ static int set_evaluate(struct eval_ctx *ctx, struct set *set)
                return 0;
        }
 
+       if (existing_set && set_is_interval(set->flags) && !set_is_interval(existing_set->flags))
+               return set_error(ctx, set, "existing %s lacks interval flag", type);
+
        set->existing_set = existing_set;
 
        return 0;
diff --git a/tests/shell/testcases/bogons/nft-f/invalid_data_expr_type_range_value_2_assert b/tests/shell/testcases/bogons/nft-f/invalid_data_expr_type_range_value_2_assert
new file mode 100644 (file)
index 0000000..56f541a
--- /dev/null
@@ -0,0 +1,13 @@
+table inet t {
+        map m2 {
+                typeof udp length . @ih,32,32 : verdict
+                elements = {
+                             1-10 . 0xa : drop }
+        }
+
+       map m2 {
+                typeof udp length . @ih,32,32 : verdict
+                flags interval
+                elements = { 20-80 . 0x14 : accept }
+        }
+}