mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
![]() -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCaINAYAAKCRCRxhvAZXjc opJiAQDXGs+gQcxJ+4BpV4QszT2OJC19oI/f5AQ4PWMJdHgr4AEA7fc6NbBrpmW7 L/tbdAwIiWp8bL1Q8Wy7Q2qldHtcggM= =KbD9 -----END PGP SIGNATURE----- Merge tag 'vfs-6.17-rc1.coredump' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs Pull coredump updates from Christian Brauner: "This contains an extension to the coredump socket and a proper rework of the coredump code. - This extends the coredump socket to allow the coredump server to tell the kernel how to process individual coredumps. This allows for fine-grained coredump management. Userspace can decide to just let the kernel write out the coredump, or generate the coredump itself, or just reject it. * COREDUMP_KERNEL The kernel will write the coredump data to the socket. * COREDUMP_USERSPACE The kernel will not write coredump data but will indicate to the parent that a coredump has been generated. This is used when userspace generates its own coredumps. * COREDUMP_REJECT The kernel will skip generating a coredump for this task. * COREDUMP_WAIT The kernel will prevent the task from exiting until the coredump server has shutdown the socket connection. The flexible coredump socket can be enabled by using the "@@" prefix instead of the single "@" prefix for the regular coredump socket: @@/run/systemd/coredump.socket - Cleanup the coredump code properly while we have to touch it anyway. Split out each coredump mode in a separate helper so it's easy to grasp what is going on and make the code easier to follow. The core coredump function should now be very trivial to follow" * tag 'vfs-6.17-rc1.coredump' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (31 commits) cleanup: add a scoped version of CLASS() coredump: add coredump_skip() helper coredump: avoid pointless variable coredump: order auto cleanup variables at the top coredump: add coredump_cleanup() coredump: auto cleanup prepare_creds() cred: add auto cleanup method coredump: directly return coredump: auto cleanup argv coredump: add coredump_write() coredump: use a single helper for the socket coredump: move pipe specific file check into coredump_pipe() coredump: split pipe coredumping into coredump_pipe() coredump: move core_pipe_count to global variable coredump: prepare to simplify exit paths coredump: split file coredumping into coredump_file() coredump: rename do_coredump() to vfs_coredump() selftests/coredump: make sure invalid paths are rejected coredump: validate socket path in coredump_parse() coredump: don't allow ".." in coredump socket path ... |
||
---|---|---|
.. | ||
config | ||
Makefile | ||
README.rst | ||
stackdump | ||
stackdump_test.c |
coredump selftest ================= Background context ------------------ `coredump` is a feature which dumps a process's memory space when the process terminates unexpectedly (e.g. due to segmentation fault), which can be useful for debugging. By default, `coredump` dumps the memory to the file named `core`, but this behavior can be changed by writing a different file name to `/proc/sys/kernel/core_pattern`. Furthermore, `coredump` can be piped to a user-space program by writing the pipe symbol (`|`) followed by the command to be executed to `/proc/sys/kernel/core_pattern`. For the full description, see `man 5 core`. The piped user program may be interested in reading the stack pointers of the crashed process. The crashed process's stack pointers can be read from `procfs`: it is the `kstkesp` field in `/proc/$PID/stat`. See `man 5 proc` for all the details. The problem ----------- While a thread is active, the stack pointer is unsafe to read and therefore the `kstkesp` field reads zero. But when the thread is dead (e.g. during a coredump), this field should have valid value. However, this was broken in the past and `kstkesp` was zero even during coredump: * commit 0a1eb2d474ed ("fs/proc: Stop reporting eip and esp in /proc/PID/stat") changed kstkesp to always be zero * commit fd7d56270b52 ("fs/proc: Report eip/esp in /prod/PID/stat for coredumping") fixed it for the coredumping thread. However, other threads in a coredumping process still had the problem. * commit cb8f381f1613 ("fs/proc/array.c: allow reporting eip/esp for all coredumping threads") fixed for all threads in a coredumping process. * commit 92307383082d ("coredump: Don't perform any cleanups before dumping core") broke it again for the other threads in a coredumping process. The problem has been fixed now, but considering the history, it may appear again in the future. The goal of this test --------------------- This test detects problem with reading `kstkesp` during coredump by doing the following: #. Tell the kernel to execute the "stackdump" script when a coredump happens. This script reads the stack pointers of all threads of crashed processes. #. Spawn a child process who creates some threads and then crashes. #. Read the output from the "stackdump" script, and make sure all stack pointer values are non-zero.