| From cb8f381f1613cafe3aec30809991cd56e7135d92 Mon Sep 17 00:00:00 2001 |
| From: John Ogness <john.ogness@linutronix.de> |
| Date: Fri, 28 Jun 2019 12:06:40 -0700 |
| Subject: fs/proc/array.c: allow reporting eip/esp for all coredumping threads |
| |
| From: John Ogness <john.ogness@linutronix.de> |
| |
| commit cb8f381f1613cafe3aec30809991cd56e7135d92 upstream. |
| |
| 0a1eb2d474ed ("fs/proc: Stop reporting eip and esp in /proc/PID/stat") |
| stopped reporting eip/esp and fd7d56270b52 ("fs/proc: Report eip/esp in |
| /prod/PID/stat for coredumping") reintroduced the feature to fix a |
| regression with userspace core dump handlers (such as minicoredumper). |
| |
| Because PF_DUMPCORE is only set for the primary thread, this didn't fix |
| the original problem for secondary threads. Allow reporting the eip/esp |
| for all threads by checking for PF_EXITING as well. This is set for all |
| the other threads when they are killed. coredump_wait() waits for all the |
| tasks to become inactive before proceeding to invoke a core dumper. |
| |
| Link: http://lkml.kernel.org/r/87y32p7i7a.fsf@linutronix.de |
| Link: http://lkml.kernel.org/r/20190522161614.628-1-jlu@pengutronix.de |
| Fixes: fd7d56270b526ca3 ("fs/proc: Report eip/esp in /prod/PID/stat for coredumping") |
| Signed-off-by: John Ogness <john.ogness@linutronix.de> |
| Reported-by: Jan Luebbe <jlu@pengutronix.de> |
| Tested-by: Jan Luebbe <jlu@pengutronix.de> |
| Cc: Alexey Dobriyan <adobriyan@gmail.com> |
| Cc: Andy Lutomirski <luto@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/proc/array.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/proc/array.c |
| +++ b/fs/proc/array.c |
| @@ -452,7 +452,7 @@ static int do_task_stat(struct seq_file |
| * a program is not able to use ptrace(2) in that case. It is |
| * safe because the task has stopped executing permanently. |
| */ |
| - if (permitted && (task->flags & PF_DUMPCORE)) { |
| + if (permitted && (task->flags & (PF_EXITING|PF_DUMPCORE))) { |
| if (try_get_task_stack(task)) { |
| eip = KSTK_EIP(task); |
| esp = KSTK_ESP(task); |