diff options
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 7e4877d9dcb..725a650bbbb 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -80,6 +80,7 @@  #include <linux/delayacct.h>  #include <linux/seq_file.h>  #include <linux/pid_namespace.h> +#include <linux/ptrace.h>  #include <linux/tracehook.h>  #include <asm/pgtable.h> @@ -352,6 +353,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	char state;  	pid_t ppid = 0, pgid = -1, sid = -1;  	int num_threads = 0; +	int permitted;  	struct mm_struct *mm;  	unsigned long long start_time;  	unsigned long cmin_flt = 0, cmaj_flt = 0; @@ -364,11 +366,14 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	state = *get_task_state(task);  	vsize = eip = esp = 0; +	permitted = ptrace_may_access(task, PTRACE_MODE_READ);  	mm = get_task_mm(task);  	if (mm) {  		vsize = task_vsize(mm); -		eip = KSTK_EIP(task); -		esp = KSTK_ESP(task); +		if (permitted) { +			eip = KSTK_EIP(task); +			esp = KSTK_ESP(task); +		}  	}  	get_task_comm(tcomm, task); @@ -424,7 +429,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  		unlock_task_sighand(task, &flags);  	} -	if (!whole || num_threads < 2) +	if (permitted && (!whole || num_threads < 2))  		wchan = get_wchan(task);  	if (!whole) {  		min_flt = task->min_flt; @@ -476,7 +481,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  		rsslim,  		mm ? mm->start_code : 0,  		mm ? mm->end_code : 0, -		mm ? mm->start_stack : 0, +		(permitted && mm) ? mm->start_stack : 0,  		esp,  		eip,  		/* The signal information here is obsolete.  | 
