From: Florian Westphal Date: Mon, 14 Jul 2025 11:48:24 +0000 (+0200) Subject: json: BASECHAIN flag no longer implies presence of priority expression X-Git-Tag: v1.1.4~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=715010c61ba25627b57d95d096138013e7c0e194;p=thirdparty%2Fnftables.git json: BASECHAIN flag no longer implies presence of priority expression 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 --- diff --git a/src/json.c b/src/json.c index 5d34b27e..977f5566 100644 --- a/src/json.c +++ b/src/json.c @@ -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 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