netfilter: cttimeout: inc/dec module refcount per object, not per use refcount
authorFlorian Westphal <fw@strlen.de>
Wed, 23 Mar 2022 13:22:06 +0000 (14:22 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 8 Apr 2022 10:08:58 +0000 (12:08 +0200)
There is no need to increment the module refcount again, its enough to
obtain one reference per object, i.e. take a reference on object
creation and put it on object destruction.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nfnetlink_cttimeout.c

index b0d8888a539bd4a7f700835a62cc218215e5732f..eea486f3297107675b84e93615410569e868768d 100644 (file)
@@ -158,6 +158,7 @@ static int cttimeout_new_timeout(struct sk_buff *skb,
        timeout->timeout.l3num = l3num;
        timeout->timeout.l4proto = l4proto;
        refcount_set(&timeout->refcnt, 1);
+       __module_get(THIS_MODULE);
        list_add_tail_rcu(&timeout->head, &pernet->nfct_timeout_list);
 
        return 0;
@@ -506,13 +507,8 @@ static struct nf_ct_timeout *ctnl_timeout_find_get(struct net *net,
                if (strncmp(timeout->name, name, CTNL_TIMEOUT_NAME_MAX) != 0)
                        continue;
 
-               if (!try_module_get(THIS_MODULE))
+               if (!refcount_inc_not_zero(&timeout->refcnt))
                        goto err;
-
-               if (!refcount_inc_not_zero(&timeout->refcnt)) {
-                       module_put(THIS_MODULE);
-                       goto err;
-               }
                matching = timeout;
                break;
        }
@@ -525,10 +521,10 @@ static void ctnl_timeout_put(struct nf_ct_timeout *t)
        struct ctnl_timeout *timeout =
                container_of(t, struct ctnl_timeout, timeout);
 
-       if (refcount_dec_and_test(&timeout->refcnt))
+       if (refcount_dec_and_test(&timeout->refcnt)) {
                kfree_rcu(timeout, rcu_head);
-
-       module_put(THIS_MODULE);
+               module_put(THIS_MODULE);
+       }
 }
 
 static const struct nfnl_callback cttimeout_cb[IPCTNL_MSG_TIMEOUT_MAX] = {