netfilter: cttimeout: inc/dec module refcount per object, not per use refcount
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>
This commit is contained in:
parent
49001a2e83
commit
523895e5b2
@ -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] = {
|
||||
|
Loading…
Reference in New Issue
Block a user