fix reading ESP during coredump
Subsystems (4)
v2 cover fix reading ESP during coredump
Hi,
In /proc/PID/stat, there is the kstkesp field which is the stack pointer of a thread. While the thread is active, this field reads zero. But during a coredump, it should have a valid value.
However, at the moment, kstkesp is zero even during coredump.
The first commit fixes this problem, and the second commit adds a selftest to detect if this problem appears again in the future.
v2:
- Change the fix patch to use PF_POSTCOREDUMP [Oleg]
Link to v1:
https://lore.kernel.org/lkml/[email protected]/
Nam Cao (2):
fs/proc: do_task_stat: Fix ESP not readable during coredump
selftests: coredump: Add stackdump test
fs/proc/array.c | 2 +- tools/testing/selftests/coredump/Makefile | 7 + tools/testing/selftests/coredump/README.rst | 50 ++++++ tools/testing/selftests/coredump/stackdump | 14 ++ .../selftests/coredump/stackdump_test.c | 154 ++++++++++++++++++ 5 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/coredump/Makefile create mode 100644 tools/testing/selftests/coredump/README.rst create mode 100755 tools/testing/selftests/coredump/stackdump create mode 100644 tools/testing/selftests/coredump/stackdump_test.c
Signature · 1 line
2.39.5
PATCH v2 1/2 fs/proc: do_task_stat: Fix ESP not readable during coredump
The field "eip" (instruction pointer) and "esp" (stack pointer) of a task can be read from /proc/PID/stat. These fields can be interesting for coredump.
However, these fields were disabled by commit 0a1eb2d474ed ("fs/proc: Stop reporting eip and esp in /proc/PID/stat"), because it is generally unsafe to do so. But it is safe for a coredumping process, and therefore exceptions were made:
- for a coredumping thread by commit fd7d56270b52 ("fs/proc: Report eip/esp in /prod/PID/stat for coredumping").
- for all other threads in a coredumping process by commit cb8f381f1613 ("fs/proc/array.c: allow reporting eip/esp for all coredumping threads").
The above two commits check the PF_DUMPCORE flag to determine a coredump thread and the PF_EXITING flag for the other threads.
Unfortunately, commit 92307383082d ("coredump: Don't perform any cleanups before dumping core") moved coredump to happen earlier and before PF_EXITING is set. Thus, checking PF_EXITING is no longer the correct way to determine threads in a coredumping process.
Instead of PF_EXITING, use PF_POSTCOREDUMP to determine the other threads.
Checking of PF_EXITING was added for coredumping, so it probably can now be removed. But it doesn't hurt to keep.
--- fs/proc/array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/proc/array.c +1 -1
@@ -500,7 +500,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,* 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_EXITING |PF_DUMPCORE ))) { +if (permitted && (task->flags & (PF_EXITING |PF_DUMPCORE |PF_POSTCOREDUMP ))) {if (try_get_task_stack (task)) { eip =KSTK_EIP (task); esp =KSTK_ESP (task);
Signature · 1 line
2.39.5
Re: [PATCH v2 1/2] fs/proc: do_task_stat: Fix ESP not readable during coredump
Quoted 26 lines · Nam Cao
The field "eip" (instruction pointer) and "esp" (stack pointer) of a task can be read from
/proc/PID/stat. These fields can be interesting for coredump.However, these fields were disabled by commit
0a1eb2d474ed("fs/proc: Stop reporting eip and esp in/proc/PID/stat"), because it is generally unsafe to do so. But it is safe for a coredumping process, and therefore exceptions were made:- for a coredumping thread by commit
fd7d56270b52("fs/proc: Report eip/esp in /prod/PID/stat for coredumping").- for all other threads in a coredumping process by commit
cb8f381f1613("fs/proc/array.c: allow reporting eip/esp for all coredumping threads").The above two commits check the
PF_DUMPCOREflag to determine a coredump thread and thePF_EXITINGflag for the other threads.Unfortunately, commit
92307383082d("coredump: Don't perform any cleanups before dumping core") moved coredump to happen earlier and beforePF_EXITINGis set. Thus, checkingPF_EXITINGis no longer the correct way to determine threads in a coredumping process.Instead of
PF_EXITING, usePF_POSTCOREDUMPto determine the other threads.
Quoted 8 lines
Checking of
PF_EXITINGwas added for coredumping, so it probably can now be removed. But it doesn't hurt to keep.Fixes 92307383082d ("coredump: Don't perform any cleanups before dumping core")Cc Eric W. Biederman <[email protected]>Acked-by Oleg Nesterov <[email protected]>Signed-off-by Nam Cao <[email protected]>
Thanks for fixing this!
Signature · 1 line
Kees Cook
PATCH v2 2/2 selftests: coredump: Add stackdump test
In reply to Nam CaoAdd a test which checks that the kstkesp field in /proc/pid/stat can be read for all threads of a coredumping process.
For full details including the motivation for this test and how it works, see the README file added by this commit.
--- tools/testing/selftests/coredump/Makefile | 7 + tools/testing/selftests/coredump/README.rst | 50 ++++++ tools/testing/selftests/coredump/stackdump | 14 ++ .../selftests/coredump/stackdump_test.c | 154 ++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 tools/testing/selftests/coredump/Makefile create mode 100644 tools/testing/selftests/coredump/README.rst create mode 100755 tools/testing/selftests/coredump/stackdump create mode 100644 tools/testing/selftests/coredump/stackdump_test.c
tools/testing/selftests/coredump/Makefile new file +7 -0
@@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0-only +CFLAGS = $(KHDR_INCLUDES) + +TEST_GEN_PROGS := stackdump_test +TEST_FILES := stackdump + +include ../lib.mk
tools/testing/selftests/coredump/README.rst new file +50 -0
50 lines not on this page · raw message
tools/testing/selftests/coredump/stackdump new file +14 -0
@@ -0,0 +1,14 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +CRASH_PROGRAM_ID=$1 +STACKDUMP_FILE=$2 + +TMP=$(mktemp) + +for t in /proc/$CRASH_PROGRAM_ID/task/*; do + tid=$(basename $t) + cat /proc/$tid/stat | awk '{print $29}' >> $TMP +done + +mv $TMP $STACKDUMP_FILE
tools/testing/selftests/coredump/stackdump_test.c new file +154 -0
154 lines not on this page · raw message
Signature · 1 line
2.39.5
Re: [PATCH v2 2/2] selftests: coredump: Add stackdump test
Quoted 5 lines · Nam Cao
Add a test which checks that the kstkesp field in
/proc/pid/statcan be read for all threads of a coredumping process.For full details including the motivation for this test and how it works, see the README file added by this commit.
This is great! One tiny nit below...
Quoted 1 line
+#define
STACKDUMP_FILE"/tmp/kselftest_stackdump"
Please move this to the local directory (and have the Makefile and/or test itself clean it up). (Or use mkstemp()) I don't want to have "well known" filenames appearing in /tmp for selftests.
-Kees
Signature · 1 line
Kees Cook