]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
netfilter: nf_tables: fix wrong destroy anonymous sets if binding fails
authorLiping Zhang <liping.zhang@spreadtrum.com>
Sat, 11 Jun 2016 04:20:28 +0000 (12:20 +0800)
committerDhaval Giani <dhaval.giani@oracle.com>
Mon, 16 Jan 2017 21:38:00 +0000 (16:38 -0500)
When we add a nft rule like follows:
  # nft add rule filter test tcp dport vmap {1: jump test}
-ELOOP error will be returned, and the anonymous set will be
destroyed.

But after that, nf_tables_abort will also try to remove the
element and destroy the set, which was already destroyed and
freed.

If we add a nft wrong rule, nft_tables_abort will do the cleanup
work rightly, so nf_tables_set_destroy call here is redundant and
wrong, remove it.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
(cherry picked from commit a02f424863610a0a7abd80c468839e59cfa4d0d8)

Oragbug: 24749203
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
Reviewed-by: John Haxby <john.haxby@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
net/netfilter/nf_tables_api.c

index e7d689a11298a4f739e12732bd3d45a7d85b0053..30b6cbd215f58d08406b7b0046ef694ba320c4d3 100644 (file)
@@ -2877,13 +2877,8 @@ int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
                iter.fn         = nf_tables_bind_check_setelem;
 
                set->ops->walk(ctx, set, &iter);
-               if (iter.err < 0) {
-                       /* Destroy anonymous sets if binding fails */
-                       if (set->flags & NFT_SET_ANONYMOUS)
-                               nf_tables_set_destroy(ctx, set);
-
+               if (iter.err < 0)
                        return iter.err;
-               }
        }
 bind:
        binding->chain = ctx->chain;