netfilter: nf_tables: fix wrong transaction ordering in set elements
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 22 May 2014 10:36:03 +0000 (12:36 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 2 Jun 2014 08:54:25 +0000 (10:54 +0200)
The transaction needs to be placed at the end of the commit list,
otherwise event notifications are reordered and we may crash when
releasing object via call_rcu.

This problem was introduced in 60319eb ("netfilter: nf_tables: use new
transaction infrastructure to handle elements").

Reported-by: Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_tables_api.c

index 047884776586db680a9b9547ceb94e9a2035bf9c..9365531ee911b26c7959910fec42431cea7d05f9 100644 (file)
@@ -3077,7 +3077,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
                goto err4;
 
        nft_trans_elem(trans) = elem;
-       list_add(&trans->list, &ctx->net->nft.commit_list);
+       list_add_tail(&trans->list, &ctx->net->nft.commit_list);
        return 0;
 
 err4:
@@ -3161,7 +3161,7 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
                goto err2;
 
        nft_trans_elem(trans) = elem;
-       list_add(&trans->list, &ctx->net->nft.commit_list);
+       list_add_tail(&trans->list, &ctx->net->nft.commit_list);
 
        nft_data_uninit(&elem.key, NFT_DATA_VALUE);
        if (set->flags & NFT_SET_MAP)