]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
json: BASECHAIN flag no longer implies presence of priority expression
authorFlorian Westphal <fw@strlen.de>
Mon, 14 Jul 2025 11:48:24 +0000 (13:48 +0200)
committerFlorian Westphal <fw@strlen.de>
Thu, 17 Jul 2025 12:25:36 +0000 (14:25 +0200)
This is a followup to
44ea19364637 ("src: BASECHAIN flag no longer implies presence of priority expression"):
feeding the same bogon file into nft -j we get a very similar crash.

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

index 5d34b27eb915b19287ca6a69764a8904f854f39b..977f55667fc20937fbf57fe7af039e4ff017bd66 100644 (file)
@@ -294,8 +294,7 @@ static json_t *rule_print_json(struct output_ctx *octx,
 
 static json_t *chain_print_json(const struct chain *chain)
 {
-       json_t *root, *tmp, *devs = NULL;
-       int priority, policy, i;
+       json_t *root;
 
        root = nft_json_pack("{s:s, s:s, s:s, s:I}",
                         "family", family2str(chain->handle.family),
@@ -307,8 +306,12 @@ static json_t *chain_print_json(const struct chain *chain)
                json_object_set_new(root, "comment", json_string(chain->comment));
 
        if (chain->flags & CHAIN_F_BASECHAIN) {
-               mpz_export_data(&priority, chain->priority.expr->value,
-                               BYTEORDER_HOST_ENDIAN, sizeof(int));
+               json_t *tmp = NULL, *devs = NULL;
+               int priority = 0, policy, i;
+
+               if (chain->priority.expr)
+                       mpz_export_data(&priority, chain->priority.expr->value,
+                                       BYTEORDER_HOST_ENDIAN, sizeof(int));
 
                if (chain->policy) {
                        mpz_export_data(&policy, chain->policy->value,
@@ -317,12 +320,15 @@ static json_t *chain_print_json(const struct chain *chain)
                        policy = NF_ACCEPT;
                }
 
-               tmp = nft_json_pack("{s:s, s:s, s:i, s:s}",
-                               "type", chain->type.str,
-                               "hook", hooknum2str(chain->handle.family,
-                                                   chain->hook.num),
-                               "prio", priority,
-                               "policy", chain_policy2str(policy));
+               if (chain->type.str)
+                       tmp = nft_json_pack("{s:s, s:s, s:i, s:s}",
+                                       "type", chain->type.str,
+                                       "hook", hooknum2str(chain->handle.family,
+                                                           chain->hook.num),
+                                       "prio", priority,
+                                       "policy", chain_policy2str(policy));
+               else
+                       tmp = NULL;
 
                for (i = 0; i < chain->dev_array_len; i++) {
                        const char *dev = chain->dev_array[i];
@@ -336,8 +342,10 @@ static json_t *chain_print_json(const struct chain *chain)
                if (devs)
                        json_object_set_new(root, "dev", devs);
 
-               json_object_update(root, tmp);
-               json_decref(tmp);
+               if (tmp) {
+                       json_object_update(root, tmp);
+                       json_decref(tmp);
+               }
        }
 
        return nft_json_pack("{s:o}", "chain", root);
diff --git a/tests/shell/testcases/bogons/nft-j-f/null_ingress_type_crash b/tests/shell/testcases/bogons/nft-j-f/null_ingress_type_crash
new file mode 100644 (file)
index 0000000..2ed88af
--- /dev/null
@@ -0,0 +1,6 @@
+table netdev filter1 {
+       chain c {
+               devices = { lo }
+       }
+}
+list ruleset