|
5 | 5 | #include <linux/unix_diag.h>
|
6 | 6 | #include <linux/skbuff.h>
|
7 | 7 | #include <linux/module.h>
|
| 8 | +#include <linux/uidgid.h> |
8 | 9 | #include <net/netlink.h>
|
9 | 10 | #include <net/af_unix.h>
|
10 | 11 | #include <net/tcp_states.h>
|
| 12 | +#include <net/sock.h> |
11 | 13 |
|
12 | 14 | static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb)
|
13 | 15 | {
|
@@ -111,6 +113,12 @@ static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb)
|
111 | 113 | return nla_put(nlskb, UNIX_DIAG_RQLEN, sizeof(rql), &rql);
|
112 | 114 | }
|
113 | 115 |
|
| 116 | +static int sk_diag_dump_uid(struct sock *sk, struct sk_buff *nlskb) |
| 117 | +{ |
| 118 | + uid_t uid = from_kuid_munged(sk_user_ns(nlskb->sk), sock_i_uid(sk)); |
| 119 | + return nla_put(nlskb, UNIX_DIAG_UID, sizeof(uid_t), &uid); |
| 120 | +} |
| 121 | + |
114 | 122 | static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_req *req,
|
115 | 123 | u32 portid, u32 seq, u32 flags, int sk_ino)
|
116 | 124 | {
|
@@ -157,6 +165,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r
|
157 | 165 | if (nla_put_u8(skb, UNIX_DIAG_SHUTDOWN, sk->sk_shutdown))
|
158 | 166 | goto out_nlmsg_trim;
|
159 | 167 |
|
| 168 | + if ((req->udiag_show & UDIAG_SHOW_UID) && |
| 169 | + sk_diag_dump_uid(sk, skb)) |
| 170 | + goto out_nlmsg_trim; |
| 171 | + |
160 | 172 | nlmsg_end(skb, nlh);
|
161 | 173 | return 0;
|
162 | 174 |
|
|
0 commit comments