|
@@ -912,7 +912,8 @@ static void netlink_rcv_wake(struct sock *sk)
|
|
|
wake_up_interruptible(&nlk->wait);
|
|
|
}
|
|
|
|
|
|
-static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb)
|
|
|
+static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb,
|
|
|
+ struct sock *ssk)
|
|
|
{
|
|
|
int ret;
|
|
|
struct netlink_sock *nlk = nlk_sk(sk);
|
|
@@ -921,6 +922,7 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb)
|
|
|
if (nlk->netlink_rcv != NULL) {
|
|
|
ret = skb->len;
|
|
|
skb_set_owner_r(skb, sk);
|
|
|
+ NETLINK_CB(skb).ssk = ssk;
|
|
|
nlk->netlink_rcv(skb);
|
|
|
consume_skb(skb);
|
|
|
} else {
|
|
@@ -947,7 +949,7 @@ retry:
|
|
|
return PTR_ERR(sk);
|
|
|
}
|
|
|
if (netlink_is_kernel(sk))
|
|
|
- return netlink_unicast_kernel(sk, skb);
|
|
|
+ return netlink_unicast_kernel(sk, skb, ssk);
|
|
|
|
|
|
if (sk_filter(sk, skb)) {
|
|
|
err = skb->len;
|