summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2025-07-14 13:48:24 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 20:52:31 +0200
commit362ec106c7bd42bda776cc9349c0868145b101c2 (patch)
treee20ffc3cc57c932923ae024d718869a76959cad1
parent654931becdb4e198349d1ac63b5122a6b7c84b92 (diff)
json: BASECHAIN flag no longer implies presence of priority expression
commit 715010c61ba25627b57d95d096138013e7c0e194 upstream. 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>
-rw-r--r--src/json.c32
-rw-r--r--tests/shell/testcases/bogons/nft-j-f/null_ingress_type_crash6
2 files changed, 26 insertions, 12 deletions
diff --git a/src/json.c b/src/json.c
index 3b3565c0..b0053e6f 100644
--- a/src/json.c
+++ b/src/json.c
@@ -278,8 +278,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),
@@ -291,8 +290,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,
@@ -301,12 +304,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];
@@ -320,8 +326,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
index 00000000..2ed88af2
--- /dev/null
+++ b/tests/shell/testcases/bogons/nft-j-f/null_ingress_type_crash
@@ -0,0 +1,6 @@
+table netdev filter1 {
+ chain c {
+ devices = { lo }
+ }
+}
+list ruleset