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 /net/netfilter | |
parent | bb52c7acf871537a468433775151339f783d2e8c (diff) | |
parent | 1a31a4a8388a90e9240fb4e5e5c9c909fcfdfd0e (diff) |
Merge branch 'nf' of git://1984.lsi.us.es/net
Diffstat (limited to 'net/netfilter')
-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, | |||
1358 | nf_ct_protonum(ct)); | 1358 | nf_ct_protonum(ct)); |
1359 | if (helper == NULL) { | 1359 | if (helper == NULL) { |
1360 | rcu_read_unlock(); | 1360 | rcu_read_unlock(); |
1361 | spin_unlock_bh(&nf_conntrack_lock); | ||
1361 | #ifdef CONFIG_MODULES | 1362 | #ifdef CONFIG_MODULES |
1362 | if (request_module("nfct-helper-%s", helpname) < 0) { | 1363 | if (request_module("nfct-helper-%s", helpname) < 0) { |
1364 | spin_lock_bh(&nf_conntrack_lock); | ||
1363 | err = -EOPNOTSUPP; | 1365 | err = -EOPNOTSUPP; |
1364 | goto err1; | 1366 | goto err1; |
1365 | } | 1367 | } |
1366 | 1368 | ||
1369 | spin_lock_bh(&nf_conntrack_lock); | ||
1367 | rcu_read_lock(); | 1370 | rcu_read_lock(); |
1368 | helper = __nf_conntrack_helper_find(helpname, | 1371 | helper = __nf_conntrack_helper_find(helpname, |
1369 | nf_ct_l3num(ct), | 1372 | nf_ct_l3num(ct), |
@@ -1869,25 +1872,30 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, | |||
1869 | 1872 | ||
1870 | err = -ENOMEM; | 1873 | err = -ENOMEM; |
1871 | skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 1874 | skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
1872 | if (skb2 == NULL) | 1875 | if (skb2 == NULL) { |
1876 | nf_ct_expect_put(exp); | ||
1873 | goto out; | 1877 | goto out; |
1878 | } | ||
1874 | 1879 | ||
1875 | rcu_read_lock(); | 1880 | rcu_read_lock(); |
1876 | err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, | 1881 | err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, |
1877 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp); | 1882 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp); |
1878 | rcu_read_unlock(); | 1883 | rcu_read_unlock(); |
1884 | nf_ct_expect_put(exp); | ||
1879 | if (err <= 0) | 1885 | if (err <= 0) |
1880 | goto free; | 1886 | goto free; |
1881 | 1887 | ||
1882 | nf_ct_expect_put(exp); | 1888 | err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); |
1889 | if (err < 0) | ||
1890 | goto out; | ||
1883 | 1891 | ||
1884 | return netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); | 1892 | return 0; |
1885 | 1893 | ||
1886 | free: | 1894 | free: |
1887 | kfree_skb(skb2); | 1895 | kfree_skb(skb2); |
1888 | out: | 1896 | out: |
1889 | nf_ct_expect_put(exp); | 1897 | /* this avoids a loop in nfnetlink. */ |
1890 | return err; | 1898 | return err == -EAGAIN ? -ENOBUFS : err; |
1891 | } | 1899 | } |
1892 | 1900 | ||
1893 | static int | 1901 | static int |