diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-24 16:10:26 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-24 16:10:26 -0500 |
commit | c43c5f39584c0f388a7e5372312c2c48221a4415 (patch) | |
tree | 1b3fcf8f3c8503df0ac0879bd268bf232bd00a0d | |
parent | bb52c7acf871537a468433775151339f783d2e8c (diff) | |
parent | 1a31a4a8388a90e9240fb4e5e5c9c909fcfdfd0e (diff) | |
download | linux-stable-c43c5f39584c0f388a7e5372312c2c48221a4415.tar.gz linux-stable-c43c5f39584c0f388a7e5372312c2c48221a4415.tar.bz2 linux-stable-c43c5f39584c0f388a7e5372312c2c48221a4415.zip |
Merge branch 'nf' of git://1984.lsi.us.es/net
-rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index ef21b221f036..b6977776d715 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -1358,12 +1358,15 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, nf_ct_protonum(ct)); if (helper == NULL) { rcu_read_unlock(); + spin_unlock_bh(&nf_conntrack_lock); #ifdef CONFIG_MODULES if (request_module("nfct-helper-%s", helpname) < 0) { + spin_lock_bh(&nf_conntrack_lock); err = -EOPNOTSUPP; goto err1; } + spin_lock_bh(&nf_conntrack_lock); rcu_read_lock(); helper = __nf_conntrack_helper_find(helpname, nf_ct_l3num(ct), @@ -1869,25 +1872,30 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, err = -ENOMEM; skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); - if (skb2 == NULL) + if (skb2 == NULL) { + nf_ct_expect_put(exp); goto out; + } rcu_read_lock(); err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp); rcu_read_unlock(); + nf_ct_expect_put(exp); if (err <= 0) goto free; - nf_ct_expect_put(exp); + err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); + if (err < 0) + goto out; - return netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); + return 0; free: kfree_skb(skb2); out: - nf_ct_expect_put(exp); - return err; + /* this avoids a loop in nfnetlink. */ + return err == -EAGAIN ? -ENOBUFS : err; } static int |