diff options
Diffstat (limited to 'net/netlink/af_netlink.c')
| -rw-r--r-- | net/netlink/af_netlink.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 2101b45d2ec6..6b9772d95872 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -702,7 +702,8 @@ struct sock *netlink_getsockbyfilp(struct file *filp) | |||
| 702 | * 0: continue | 702 | * 0: continue |
| 703 | * 1: repeat lookup - reference dropped while waiting for socket memory. | 703 | * 1: repeat lookup - reference dropped while waiting for socket memory. |
| 704 | */ | 704 | */ |
| 705 | int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long timeo) | 705 | int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, |
| 706 | long timeo, struct sock *ssk) | ||
| 706 | { | 707 | { |
| 707 | struct netlink_sock *nlk; | 708 | struct netlink_sock *nlk; |
| 708 | 709 | ||
| @@ -712,7 +713,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long t | |||
| 712 | test_bit(0, &nlk->state)) { | 713 | test_bit(0, &nlk->state)) { |
| 713 | DECLARE_WAITQUEUE(wait, current); | 714 | DECLARE_WAITQUEUE(wait, current); |
| 714 | if (!timeo) { | 715 | if (!timeo) { |
| 715 | if (!nlk->pid) | 716 | if (!ssk || nlk_sk(ssk)->pid == 0) |
| 716 | netlink_overrun(sk); | 717 | netlink_overrun(sk); |
| 717 | sock_put(sk); | 718 | sock_put(sk); |
| 718 | kfree_skb(skb); | 719 | kfree_skb(skb); |
| @@ -797,7 +798,7 @@ retry: | |||
| 797 | kfree_skb(skb); | 798 | kfree_skb(skb); |
| 798 | return PTR_ERR(sk); | 799 | return PTR_ERR(sk); |
| 799 | } | 800 | } |
| 800 | err = netlink_attachskb(sk, skb, nonblock, timeo); | 801 | err = netlink_attachskb(sk, skb, nonblock, timeo, ssk); |
| 801 | if (err == 1) | 802 | if (err == 1) |
| 802 | goto retry; | 803 | goto retry; |
| 803 | if (err) | 804 | if (err) |
