diff options
author | Guillaume Chazarain <guichaz@yahoo.fr> | 2007-01-31 23:48:14 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-01 16:22:41 -0800 |
commit | 7d8952440f4090522b740257f1c6b2cf96413969 (patch) | |
tree | 9afe525a5e3dda6ac88b533caacde21f30673ebe /fs/proc | |
parent | 432bd6cbf9f016f5480153b1cdfbd046f8d4fb1e (diff) | |
download | linux-3.10-7d8952440f4090522b740257f1c6b2cf96413969.tar.gz linux-3.10-7d8952440f4090522b740257f1c6b2cf96413969.tar.bz2 linux-3.10-7d8952440f4090522b740257f1c6b2cf96413969.zip |
[PATCH] procfs: Fix listing of /proc/NOT_A_TGID/task
Listing /proc/PID/task were PID is not a TGID should not result in
duplicated entries.
[g ~]$ pidof thunderbird-bin
2751
[g ~]$ ls /proc/2751/task
2751 2770 2771 2824 2826 2834 2835 2851 2853
[g ~]$ ls /proc/2770/task
2751 2770 2771 2824 2826 2834 2835 2851 2853
2770 2771 2824 2826 2834 2835 2851 2853
[g ~]$
Signed-off-by: Guillaume Chazarain <guichaz@yahoo.fr>
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/base.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index ff7a6685060..1a979ea3b37 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2328,13 +2328,23 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi { struct dentry *dentry = filp->f_path.dentry; struct inode *inode = dentry->d_inode; - struct task_struct *leader = get_proc_task(inode); + struct task_struct *leader = NULL; struct task_struct *task; int retval = -ENOENT; ino_t ino; int tid; unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */ + task = get_proc_task(inode); + if (!task) + goto out_no_task; + rcu_read_lock(); + if (pid_alive(task)) { + leader = task->group_leader; + get_task_struct(leader); + } + rcu_read_unlock(); + put_task_struct(task); if (!leader) goto out_no_task; retval = 0; |