Reporting these fields on a non-current task is dangerous. If the task is in any state other than normal kernel code, they may contain garbage or even kernel addresses on some architectures. (x86_64 used to do this. I bet lots of architectures still do.) With CONFIG_THREAD_INFO_IN_TASK, it can OOPS, too.
As far as I know, there are no use programs that make any material use of these fields, so just get rid of them. Cc: Tetsuo Handa <[email protected]> Cc: Tycho Andersen <[email protected]> Cc: Kees Cook <[email protected]> Reported-by: Jann Horn <[email protected]> Signed-off-by: Andy Lutomirski <[email protected]> --- fs/proc/array.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index 88c7de12197b..1bb1097e73b7 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -417,10 +417,11 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, mm = get_task_mm(task); if (mm) { vsize = task_vsize(mm); - if (permitted) { - eip = KSTK_EIP(task); - esp = KSTK_ESP(task); - } + /* + * esp and eip are intentionally zeroed out. There is no + * non-racy way to read them without freezing the task. + * Programs that need reliable values can use ptrace(2). + */ } get_task_comm(tcomm, task); -- 2.7.4

