Skip to content

Commit

Permalink
unix_diag: Unix peer inode NLA
Browse files Browse the repository at this point in the history
Report the peer socket inode ID as NLA. With this it's finally
possible to find out the other end of an interesting unix connection.

Signed-off-by: Pavel Emelyanov <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
xemul authored and davem330 committed Dec 16, 2011
1 parent 5f7b056 commit ac02be8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/linux/unix_diag.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ struct unix_diag_req {

#define UDIAG_SHOW_NAME 0x00000001 /* show name (not path) */
#define UDIAG_SHOW_VFS 0x00000002 /* show VFS inode info */
#define UDIAG_SHOW_PEER 0x00000004 /* show peer socket info */

struct unix_diag_msg {
__u8 udiag_family;
Expand All @@ -27,6 +28,7 @@ struct unix_diag_msg {
enum {
UNIX_DIAG_NAME,
UNIX_DIAG_VFS,
UNIX_DIAG_PEER,

UNIX_DIAG_MAX,
};
Expand Down
24 changes: 24 additions & 0 deletions net/unix/diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,26 @@ static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb)
return -EMSGSIZE;
}

static int sk_diag_dump_peer(struct sock *sk, struct sk_buff *nlskb)
{
struct sock *peer;
int ino;

peer = unix_peer_get(sk);
if (peer) {
unix_state_lock(peer);
ino = sock_i_ino(peer);
unix_state_unlock(peer);
sock_put(peer);

RTA_PUT_U32(nlskb, UNIX_DIAG_PEER, ino);
}

return 0;
rtattr_failure:
return -EMSGSIZE;
}

static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_req *req,
u32 pid, u32 seq, u32 flags, int sk_ino)
{
Expand All @@ -69,6 +89,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r
sk_diag_dump_vfs(sk, skb))
goto nlmsg_failure;

if ((req->udiag_show & UDIAG_SHOW_PEER) &&
sk_diag_dump_peer(sk, skb))
goto nlmsg_failure;

nlh->nlmsg_len = skb_tail_pointer(skb) - b;
return skb->len;

Expand Down

0 comments on commit ac02be8

Please sign in to comment.