packet_diag: disclose uid value
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Thu, 25 Apr 2013 06:53:52 +0000 (06:53 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Apr 2013 17:21:30 +0000 (13:21 -0400)
This value is disclosed via /proc/net/packet but not via netlink messages.
The goal is to have the same level of information.

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/packet_diag.h
net/packet/diag.c

index afafd703ad92b1595a5c7c326883fe89816f920f..84f83a47b6f66c6204bbed7f7188132a109652e7 100644 (file)
@@ -32,6 +32,7 @@ enum {
        PACKET_DIAG_RX_RING,
        PACKET_DIAG_TX_RING,
        PACKET_DIAG_FANOUT,
+       PACKET_DIAG_UID,
 
        __PACKET_DIAG_MAX,
 };
index d3fcd1ebef7ee061522175f39dda2649d8a6035f..04c8219a2d0632a8b484c488272b2b661b971a4c 100644 (file)
@@ -125,8 +125,10 @@ static int pdiag_put_fanout(struct packet_sock *po, struct sk_buff *nlskb)
        return ret;
 }
 
-static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag_req *req,
-               u32 portid, u32 seq, u32 flags, int sk_ino)
+static int sk_diag_fill(struct sock *sk, struct sk_buff *skb,
+                       struct packet_diag_req *req,
+                       struct user_namespace *user_ns,
+                       u32 portid, u32 seq, u32 flags, int sk_ino)
 {
        struct nlmsghdr *nlh;
        struct packet_diag_msg *rp;
@@ -147,6 +149,11 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct packet_diag
                        pdiag_put_info(po, skb))
                goto out_nlmsg_trim;
 
+       if ((req->pdiag_show & PACKET_SHOW_INFO) &&
+           nla_put_u32(skb, PACKET_DIAG_UID,
+                       from_kuid_munged(user_ns, sock_i_uid(sk))))
+               goto out_nlmsg_trim;
+
        if ((req->pdiag_show & PACKET_SHOW_MCLIST) &&
                        pdiag_put_mclist(po, skb))
                goto out_nlmsg_trim;
@@ -183,9 +190,11 @@ static int packet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
                if (num < s_num)
                        goto next;
 
-               if (sk_diag_fill(sk, skb, req, NETLINK_CB(cb->skb).portid,
-                                       cb->nlh->nlmsg_seq, NLM_F_MULTI,
-                                       sock_i_ino(sk)) < 0)
+               if (sk_diag_fill(sk, skb, req,
+                                sk_user_ns(NETLINK_CB(cb->skb).sk),
+                                NETLINK_CB(cb->skb).portid,
+                                cb->nlh->nlmsg_seq, NLM_F_MULTI,
+                                sock_i_ino(sk)) < 0)
                        goto done;
 next:
                num++;