|
@@ -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.
|