Subject: [PATCH] nethost: Only display af_unix sockets for the current host. From: Eric W. Biederman Date: 1133878126 -0700 --- net/unix/af_unix.c | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) ba32b5675c276019e9e979306ce8738160307a85 diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 9ca3ca2..4073b4d 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1909,12 +1909,19 @@ static unsigned int unix_poll(struct fil #ifdef CONFIG_PROC_FS -static struct sock *unix_seq_idx(int *iter, loff_t pos) +struct unix_iter_state { + struct nethost *host; + int i; +}; + +static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos) { loff_t off = 0; struct sock *s; - for (s = first_unix_socket(iter); s; s = next_unix_socket(iter, s)) { + for (s = first_unix_socket(&iter->i); s; s = next_unix_socket(&iter->i, s)) { + if (s->sk_host != iter->host) + continue; if (off == pos) return s; ++off; @@ -1931,11 +1938,17 @@ static void *unix_seq_start(struct seq_f static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos) { + struct unix_iter_state *iter = seq->private; + struct sock *sk = v; ++*pos; if (v == (void *)1) - return first_unix_socket(seq->private); - return next_unix_socket(seq->private, v); + sk = first_unix_socket(&iter->i); + else + sk = next_unix_socket(&iter->i, sk); + while(sk && (sk->sk_host != iter->host)) + sk = next_unix_socket(&iter->i, sk); + return sk; } static void unix_seq_stop(struct seq_file *seq, void *v) @@ -1999,7 +2012,7 @@ static int unix_seq_open(struct inode *i { struct seq_file *seq; int rc = -ENOMEM; - int *iter = kmalloc(sizeof(int), GFP_KERNEL); + struct unix_iter_state *iter = kmalloc(sizeof(*iter), GFP_KERNEL); if (!iter) goto out; @@ -2010,7 +2023,8 @@ static int unix_seq_open(struct inode *i seq = file->private_data; seq->private = iter; - *iter = 0; + iter->i = 0; + iter->host = current->host; out: return rc; out_kfree: -- 1.0.GIT