set->nelems is increased when set->size is given.
so that checking set->size routine should be added.

Signed-off-by: Taehee Yoo <ap420...@gmail.com>
---
 net/netfilter/nf_tables_api.c  | 6 ++++--
 net/netfilter/nft_set_hash.c   | 3 ++-
 net/netfilter/nft_set_rbtree.c | 7 ++++---
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 896d4a3..99a85b6 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -6377,7 +6377,8 @@ static int nf_tables_commit(struct net *net, struct 
sk_buff *skb)
                                                 &te->elem,
                                                 NFT_MSG_DELSETELEM, 0);
                        te->set->ops->remove(net, te->set, &te->elem);
-                       atomic_dec(&te->set->nelems);
+                       if (te->set->size)
+                               atomic_dec(&te->set->nelems);
                        te->set->ndeact--;
                        break;
                case NFT_MSG_NEWOBJ:
@@ -6510,7 +6511,8 @@ static int __nf_tables_abort(struct net *net)
                        te = (struct nft_trans_elem *)trans->data;
 
                        te->set->ops->remove(net, te->set, &te->elem);
-                       atomic_dec(&te->set->nelems);
+                       if (te->set->size)
+                               atomic_dec(&te->set->nelems);
                        break;
                case NFT_MSG_DELSETELEM:
                        te = (struct nft_trans_elem *)trans->data;
diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c
index ef66824..d736ab1 100644
--- a/net/netfilter/nft_set_hash.c
+++ b/net/netfilter/nft_set_hash.c
@@ -328,7 +328,8 @@ static void nft_rhash_gc(struct work_struct *work)
                if (gcb == NULL)
                        goto out;
                rhashtable_remove_fast(&priv->ht, &he->node, nft_rhash_params);
-               atomic_dec(&set->nelems);
+               if (set->size)
+                       atomic_dec(&set->nelems);
                nft_set_gc_batch_add(gcb, he);
        }
 out:
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
index 1db52b0..de2d6b6 100644
--- a/net/netfilter/nft_set_rbtree.c
+++ b/net/netfilter/nft_set_rbtree.c
@@ -382,8 +382,8 @@ static void nft_rbtree_gc(struct work_struct *work)
                gcb = nft_set_gc_batch_check(set, gcb, GFP_ATOMIC);
                if (!gcb)
                        goto out;
-
-               atomic_dec(&set->nelems);
+               if (set->size)
+                       atomic_dec(&set->nelems);
                nft_set_gc_batch_add(gcb, rbe);
 
                if (interval) {
@@ -398,7 +398,8 @@ static void nft_rbtree_gc(struct work_struct *work)
                        }
                        if (nft_set_elem_mark_busy(&rbe->ext))
                                continue;
-                       atomic_dec(&set->nelems);
+                       if (set->size)
+                               atomic_dec(&set->nelems);
                        nft_set_gc_batch_add(gcb, rbe);
                }
        }
-- 
2.9.3

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to