diff options
| author | Oleg Nesterov <[email protected]> | 2014-12-10 15:45:10 -0800 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2014-12-10 17:41:09 -0800 | 
| commit | 4af1036df4dd4f0d59fad9d82ed456bfa2e73fa6 (patch) | |
| tree | db1e1ccc62ddffb35e429d9d306752a27ac4d9de /fs/proc/array.c | |
| parent | 2fc1e948e820bddf8a686c6e2989219b471d7982 (diff) | |
proc: task_state: read cred->group_info outside of task_lock()
task_state() reads cred->group_info under task_lock() because a long ago
it was task_struct->group_info and it was actually protected by
task->alloc_lock.  Today this task_unlock() after rcu_read_unlock() just
adds the confusion, move task_unlock() up.
Signed-off-by: Oleg Nesterov <[email protected]>
Cc: Aaron Tomlin <[email protected]>
Cc: Alexey Dobriyan <[email protected]>
Cc: "Eric W. Biederman" <[email protected]>,
Cc: Sterling Alexander <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Roland McGrath <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 3 | 
1 files changed, 1 insertions, 2 deletions
| diff --git a/fs/proc/array.c b/fs/proc/array.c index cd3653e4f35c..b5810c228c10 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -201,11 +201,10 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,  		"FDSize:\t%d\n"  		"Groups:\t",  		fdt ? fdt->max_fds : 0); +	task_unlock(p);  	rcu_read_unlock();  	group_info = cred->group_info; -	task_unlock(p); -  	for (g = 0; g < group_info->ngroups; g++)  		seq_printf(m, "%d ",  			   from_kgid_munged(user_ns, GROUP_AT(group_info, g))); |