Commit 523895e5 authored by Florian Westphal's avatar Florian Westphal Committed by Pablo Neira Ayuso
Browse files

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: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 49001a2e
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -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,11 +521,11 @@ 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);
	}
}

static const struct nfnl_callback cttimeout_cb[IPCTNL_MSG_TIMEOUT_MAX] = {
	[IPCTNL_MSG_TIMEOUT_NEW] = {