]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser_json: reject non-concat expression
authorFlorian Westphal <fw@strlen.de>
Mon, 21 Jul 2025 11:09:55 +0000 (13:09 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Aug 2025 18:54:15 +0000 (20:54 +0200)
commit f4d3e5e2f6595b6628b2aa948ff45ffaec40fb65 upstream.

Before "src: detach set, list and concatenation expression layout":
internal:0:0-0: Error: Concatenation with 0 elements is illegal

After this change, expr->size access triggers assert() failure, add
explicit test for etype to avoid this and error out:

internal:0:0-0: Error: Expected concat element, got symbol.

Fixes: e0d92243be1c ("src: detach set, list and concatenation expression layout")
Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/parser_json.c
tests/shell/testcases/bogons/nft-j-f/concat_is_not_concat_assert [new file with mode: 0644]

index b213478e3ec02287af088073fa414387e855ceba..f49c2619a811bc3154a6343a29d9cf8041347ce0 100644 (file)
@@ -1181,10 +1181,18 @@ static struct expr *json_parse_binop_expr(struct json_ctx *ctx,
 
 static struct expr *json_check_concat_expr(struct json_ctx *ctx, struct expr *e)
 {
+       if (e->etype != EXPR_CONCAT) {
+               json_error(ctx, "Expected concatenation, got %s", expr_name(e));
+               goto err_free;
+       }
+
        if (e->size >= 2)
                return e;
 
-       json_error(ctx, "Concatenation with %d elements is illegal", e->size);
+       json_error(ctx, "Concatenation with %d elements is illegal",
+                  e->size);
+
+err_free:
        expr_free(e);
        return NULL;
 }
diff --git a/tests/shell/testcases/bogons/nft-j-f/concat_is_not_concat_assert b/tests/shell/testcases/bogons/nft-j-f/concat_is_not_concat_assert
new file mode 100644 (file)
index 0000000..bdee035
--- /dev/null
@@ -0,0 +1,39 @@
+{
+  "nftables": [
+    {
+  "metainfo": {
+"ver": "ION",
+    "rame": "RAME",
+    "json_schema_version": 1
+  }
+    },
+    {
+  "table": { "family": "ip", "name": "filter",
+    "le": 0
+  }
+    },
+    {
+  "set": {
+    "family": "ip",
+    "name": "test_set",
+    "table": "filter",
+    "type": [
+  "iface_index",   "ether_addr",   "ipv4_addr"
+    ],
+    "he": 0,
+    "flags": "interval",
+"elem": [
+  {
+    "elem": {
+  "val": {
+    "concat": [
+ "10.1.2.3"
+    ]   },
+  "comment": "90"
+}
+  }
+    ]
+  }
+}
+  ]
+}