aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2017-05-01 06:58:50 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2017-05-03 04:58:00 -0400
commit9744a6fcefcb4d56501d69adb04c24559d353cad (patch)
tree679f52405bc4a0003dc105908b207a31dfd211ff
parent1519fccb34371594f6a629bfad69605bc6f9dde3 (diff)
netfilter: nf_tables: check if same extensions are set when adding elements
If no NLM_F_EXCL is set and the element already exists in the set, make sure that both elements have the same extensions. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/netfilter/nf_tables_api.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 434c739dfeca..11a96e8dd3cd 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -3749,6 +3749,11 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
3749 err = set->ops->insert(ctx->net, set, &elem, &ext2); 3749 err = set->ops->insert(ctx->net, set, &elem, &ext2);
3750 if (err) { 3750 if (err) {
3751 if (err == -EEXIST) { 3751 if (err == -EEXIST) {
3752 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) ^
3753 nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) ||
3754 nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) ^
3755 nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF))
3756 return -EBUSY;
3752 if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) && 3757 if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
3753 nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) && 3758 nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) &&
3754 memcmp(nft_set_ext_data(ext), 3759 memcmp(nft_set_ext_data(ext),