From 7674d5118262032e7b2d95a31913184808aa7565 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Thu, 2 Oct 2003 09:11:40 -0700 Subject: [PATCH] [NETFILTER]: Don't call ip_conntrack_put with ip_conntrack_lock held --- net/ipv4/netfilter/ip_conntrack_core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index c035f27deba4b..ae3f5db679b6c 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c @@ -301,7 +301,7 @@ clean_from_lists(struct ip_conntrack *ct) static void destroy_conntrack(struct nf_conntrack *nfct) { - struct ip_conntrack *ct = (struct ip_conntrack *)nfct; + struct ip_conntrack *ct = (struct ip_conntrack *)nfct, *master = NULL; struct ip_conntrack_protocol *proto; DEBUGP("destroy_conntrack(%p)\n", ct); @@ -328,12 +328,15 @@ destroy_conntrack(struct nf_conntrack *nfct) /* can't call __unexpect_related here, * since it would screw up expect_list */ list_del(&ct->master->expected_list); - ip_conntrack_put(ct->master->expectant); + master = ct->master->expectant; } kfree(ct->master); } WRITE_UNLOCK(&ip_conntrack_lock); + if (master) + ip_conntrack_put(master); + DEBUGP("destroy_conntrack: returning ct=%p to slab\n", ct); kmem_cache_free(ip_conntrack_cachep, ct); atomic_dec(&ip_conntrack_count); -- 2.53.0