]> 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)
committerFlorian Westphal <fw@strlen.de>
Tue, 22 Jul 2025 12:38:34 +0000 (14:38 +0200)
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 bd865de59007a4ac3ca8d57d8d7cc7e0e505866d..a6f142c68756083b2ff23a78075ce7910065e47d 100644 (file)
@@ -1286,11 +1286,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 (expr_concat(e)->size >= 2)
                return e;
 
        json_error(ctx, "Concatenation with %d elements is illegal",
                   expr_concat(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"
+}
+  }
+    ]
+  }
+}
+  ]
+}