Commit 5f7b0569 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

unix_diag: Unix inode info NLA

Actually, the socket path if it's not anonymous doesn't give
a clue to which file the socket is bound to. Even if the path
is absolute, it can be unlinked and then new socket can be
bound to it.

With this NLA it's possible to check which file a particular
socket is really bound to.
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f5248b48
...@@ -12,6 +12,7 @@ struct unix_diag_req { ...@@ -12,6 +12,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 */
struct unix_diag_msg { struct unix_diag_msg {
__u8 udiag_family; __u8 udiag_family;
...@@ -25,8 +26,14 @@ struct unix_diag_msg { ...@@ -25,8 +26,14 @@ struct unix_diag_msg {
enum { enum {
UNIX_DIAG_NAME, UNIX_DIAG_NAME,
UNIX_DIAG_VFS,
UNIX_DIAG_MAX, UNIX_DIAG_MAX,
}; };
struct unix_diag_vfs {
__u32 udiag_vfs_ino;
__u32 udiag_vfs_dev;
};
#endif #endif
...@@ -26,6 +26,23 @@ static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb) ...@@ -26,6 +26,23 @@ static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb)
return -EMSGSIZE; return -EMSGSIZE;
} }
static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb)
{
struct dentry *dentry = unix_sk(sk)->dentry;
struct unix_diag_vfs *uv;
if (dentry) {
uv = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_VFS, sizeof(*uv));
uv->udiag_vfs_ino = dentry->d_inode->i_ino;
uv->udiag_vfs_dev = dentry->d_sb->s_dev;
}
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)
{ {
...@@ -48,6 +65,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r ...@@ -48,6 +65,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r
sk_diag_dump_name(sk, skb)) sk_diag_dump_name(sk, skb))
goto nlmsg_failure; goto nlmsg_failure;
if ((req->udiag_show & UDIAG_SHOW_VFS) &&
sk_diag_dump_vfs(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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment