On Wed, 2012-09-12 at 23:36 +0200, Florian Westphal wrote: [...cut...] > On module removal nf_nat_ipv4 calls nf_iterate_cleanup which invokes > nf_nat_proto_clean() for each conntrack. That will then call > hlist_del_rcu(&nat->bysource) using eachs conntracks nat ext area. > > Problem is that nf_nat_proto_clean() is called multiple times for the same > conntrack: > a) nf_ct_iterate_cleanup() returns each ct twice (origin, reply) > b) we call it both for l3 and for l4 protocol ids > > We barf in hlist_del_rcu the 2nd time because ->pprev is poisoned. > > This was introduced with the ipv6 nat patches. > > --- a/net/netfilter/nf_nat_core.c > +++ b/net/netfilter/nf_nat_core.c > @@ -487,7 +487,7 @@ static int nf_nat_proto_clean(struct nf_conn *i, void *data) > > if (clean->hash) { > spin_lock_bh(&nf_nat_lock); > - hlist_del_rcu(&nat->bysource); > + hlist_del_init_rcu(&nat->bysource); > spin_unlock_bh(&nf_nat_lock); > } else { > > Would probably avoid it. I guess it would be nicer to only call this > once for each ct. Florian's patch fixes the Oops :-) -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html