Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac02be8d authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller
Browse files

unix_diag: Unix peer inode NLA



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: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5f7b0569
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@ struct unix_diag_req {


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


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


	UNIX_DIAG_MAX,
	UNIX_DIAG_MAX,
};
};
+24 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,26 @@ static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb)
	return -EMSGSIZE;
	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,
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)
		u32 pid, u32 seq, u32 flags, int sk_ino)
{
{
@@ -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))
			sk_diag_dump_vfs(sk, skb))
		goto nlmsg_failure;
		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;
	nlh->nlmsg_len = skb_tail_pointer(skb) - b;
	return skb->len;
	return skb->len;