From 447e072837cedf3b2a89c7a80a20307e79e5cd54 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Thu, 24 May 2012 17:21:27 -0600 Subject: [PATCH] --- yaml --- r: 327229 b: refs/heads/master c: 3fbc290540a1ed1a8a076ed8f53bee7a38a9f408 h: refs/heads/master i: 327227: 34ed42b587be4e80fba5b3e3566c405de23eeb7d v: v3 --- [refs] | 2 +- trunk/include/linux/netlink.h | 1 + trunk/net/netlink/af_netlink.c | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index ee33f4a3189f..f7ef07ba74ea 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d13fda8564a67341aad257465cf319bdb2327e33 +refs/heads/master: 3fbc290540a1ed1a8a076ed8f53bee7a38a9f408 diff --git a/trunk/include/linux/netlink.h b/trunk/include/linux/netlink.h index f74dd133788f..c9fdde2bc73f 100644 --- a/trunk/include/linux/netlink.h +++ b/trunk/include/linux/netlink.h @@ -165,6 +165,7 @@ struct netlink_skb_parms { struct ucred creds; /* Skb credentials */ __u32 pid; __u32 dst_group; + struct sock *ssk; }; #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) diff --git a/trunk/net/netlink/af_netlink.c b/trunk/net/netlink/af_netlink.c index 5463969da45b..7cb7867cc369 100644 --- a/trunk/net/netlink/af_netlink.c +++ b/trunk/net/netlink/af_netlink.c @@ -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 @@ int netlink_unicast(struct sock *ssk, struct sk_buff *skb, 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;