This function is apparently not "joining" two arrays but rather copying all items from the second array to the first, leaving the original reference in place. Therefore it naturally increments refcounts, which means if used to join two arrays caller must explicitly decrement the second array's refcount. Fixes: e70354f53e9f6 ("libnftables: Implement JSON output support") Signed-off-by: Phil Sutter <phil@xxxxxx> --- src/json.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/json.c b/src/json.c index 24583060e68e7..888cb371e971d 100644 --- a/src/json.c +++ b/src/json.c @@ -1568,7 +1568,7 @@ static json_t *table_print_json_full(struct netlink_ctx *ctx, static json_t *do_list_ruleset_json(struct netlink_ctx *ctx, struct cmd *cmd) { unsigned int family = cmd->handle.family; - json_t *root = json_array(); + json_t *root = json_array(), *tmp; struct table *table; list_for_each_entry(table, &ctx->nft->cache.list, list) { @@ -1576,7 +1576,9 @@ static json_t *do_list_ruleset_json(struct netlink_ctx *ctx, struct cmd *cmd) table->handle.family != family) continue; - json_array_extend(root, table_print_json_full(ctx, table)); + tmp = table_print_json_full(ctx, table); + json_array_extend(root, tmp); + json_decref(tmp); } return root; -- 2.27.0