]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: copy field_count for anonymous object maps as well
authorFlorian Westphal <fw@strlen.de>
Mon, 21 Mar 2022 16:03:41 +0000 (17:03 +0100)
committerFlorian Westphal <fw@strlen.de>
Mon, 21 Mar 2022 16:06:02 +0000 (17:06 +0100)
without this test fails with:

W: [FAILED]     tests/shell/testcases/maps/anon_objmap_concat: got 134
BUG: invalid range expression type concat
nft: expression.c:1452: range_expr_value_low: Assertion `0' failed.

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

index 07a4b0ad19b0513517282cbd74275cc34fb00911..04d42b800103e7bf9eec77019a322839a0ff95f0 100644 (file)
@@ -1513,6 +1513,20 @@ static int expr_evaluate_set(struct eval_ctx *ctx, struct expr **expr)
 }
 
 static int binop_transfer(struct eval_ctx *ctx, struct expr **expr);
+
+static void map_set_concat_info(struct expr *map)
+{
+       map->mappings->set->flags |= map->mappings->set->init->set_flags;
+
+       if (map->mappings->set->flags & NFT_SET_INTERVAL &&
+           map->map->etype == EXPR_CONCAT) {
+               memcpy(&map->mappings->set->desc.field_len, &map->map->field_len,
+                      sizeof(map->mappings->set->desc.field_len));
+               map->mappings->set->desc.field_count = map->map->field_count;
+               map->mappings->flags |= NFT_SET_CONCAT;
+       }
+}
+
 static int expr_evaluate_map(struct eval_ctx *ctx, struct expr **expr)
 {
        struct expr_ctx ectx = ctx->ectx;
@@ -1580,15 +1594,8 @@ static int expr_evaluate_map(struct eval_ctx *ctx, struct expr **expr)
                ctx->set->key->len = ctx->ectx.len;
                ctx->set = NULL;
                map = *expr;
-               map->mappings->set->flags |= map->mappings->set->init->set_flags;
-
-               if (map->mappings->set->flags & NFT_SET_INTERVAL &&
-                   map->map->etype == EXPR_CONCAT) {
-                       memcpy(&map->mappings->set->desc.field_len, &map->map->field_len,
-                              sizeof(map->mappings->set->desc.field_len));
-                       map->mappings->set->desc.field_count = map->map->field_count;
-                       map->mappings->flags |= NFT_SET_CONCAT;
-               }
+
+               map_set_concat_info(map);
                break;
        case EXPR_SYMBOL:
                if (expr_evaluate(ctx, &map->mappings) < 0)
@@ -3751,8 +3758,7 @@ static int stmt_evaluate_objref_map(struct eval_ctx *ctx, struct stmt *stmt)
                        return -1;
                ctx->set = NULL;
 
-               map->mappings->set->flags |=
-                       map->mappings->set->init->set_flags;
+               map_set_concat_info(map);
                /* fall through */
        case EXPR_SYMBOL:
                if (expr_evaluate(ctx, &map->mappings) < 0)
diff --git a/tests/shell/testcases/maps/anon_objmap_concat b/tests/shell/testcases/maps/anon_objmap_concat
new file mode 100755 (executable)
index 0000000..07820b7
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+set -e
+dumpfile=$(dirname $0)/dumps/$(basename $0).nft
+
+$NFT -f "$dumpfile"
diff --git a/tests/shell/testcases/maps/dumps/anon_objmap_concat.nft b/tests/shell/testcases/maps/dumps/anon_objmap_concat.nft
new file mode 100644 (file)
index 0000000..23aca0a
--- /dev/null
@@ -0,0 +1,16 @@
+table inet filter {
+       ct helper sip-5060u {
+               type "sip" protocol udp
+               l3proto ip
+       }
+
+       ct helper sip-5060t {
+               type "sip" protocol tcp
+               l3proto ip
+       }
+
+       chain input {
+               type filter hook input priority filter; policy accept;
+               ct helper set ip protocol . th dport map { udp . 10000-20000 : "sip-5060u", tcp . 10000-20000 : "sip-5060t" }
+       }
+}