# git rev-parse -q --verify dbb5afad100a828c97e012c6106566d99f041db6^{commit} dbb5afad100a828c97e012c6106566d99f041db6 already have revision, skipping fetch # git checkout -q -f -B kisskb dbb5afad100a828c97e012c6106566d99f041db6 # git clean -qxdf # < git log -1 # commit dbb5afad100a828c97e012c6106566d99f041db6 # Author: Oleg Nesterov # Date: Wed May 12 15:33:08 2021 +0200 # # ptrace: make ptrace() fail if the tracee changed its pid unexpectedly # # Suppose we have 2 threads, the group-leader L and a sub-theread T, # both parked in ptrace_stop(). Debugger tries to resume both threads # and does # # ptrace(PTRACE_CONT, T); # ptrace(PTRACE_CONT, L); # # If the sub-thread T execs in between, the 2nd PTRACE_CONT doesn not # resume the old leader L, it resumes the post-exec thread T which was # actually now stopped in PTHREAD_EVENT_EXEC. In this case the # PTHREAD_EVENT_EXEC event is lost, and the tracer can't know that the # tracee changed its pid. # # This patch makes ptrace() fail in this case until debugger does wait() # and consumes PTHREAD_EVENT_EXEC which reports old_pid. This affects all # ptrace requests except the "asynchronous" PTRACE_INTERRUPT/KILL. # # The patch doesn't add the new PTRACE_ option to not complicate the API, # and I _hope_ this won't cause any noticeable regression: # # - If debugger uses PTRACE_O_TRACEEXEC and the thread did an exec # and the tracer does a ptrace request without having consumed # the exec event, it's 100% sure that the thread the ptracer # thinks it is targeting does not exist anymore, or isn't the # same as the one it thinks it is targeting. # # - To some degree this patch adds nothing new. In the scenario # above ptrace(L) can fail with -ESRCH if it is called after the # execing sub-thread wakes the leader up and before it "steals" # the leader's pid. # # Test-case: # # #include # #include # #include # #include # #include # #include # #include # #include # # void *tf(void *arg) # { # execve("/usr/bin/true", NULL, NULL); # assert(0); # # return NULL; # } # # int main(void) # { # int leader = fork(); # if (!leader) { # kill(getpid(), SIGSTOP); # # pthread_t th; # pthread_create(&th, NULL, tf, NULL); # for (;;) # pause(); # # return 0; # } # # waitpid(leader, NULL, WSTOPPED); # # ptrace(PTRACE_SEIZE, leader, 0, # PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC); # waitpid(leader, NULL, 0); # # ptrace(PTRACE_CONT, leader, 0,0); # waitpid(leader, NULL, 0); # # int status, thread = waitpid(-1, &status, 0); # assert(thread > 0 && thread != leader); # assert(status == 0x80137f); # # ptrace(PTRACE_CONT, thread, 0,0); # /* # * waitid() because waitpid(leader, &status, WNOWAIT) does not # * report status. Why ???? # * # * Why WEXITED? because we have another kernel problem connected # * to mt-exec. # */ # siginfo_t info; # assert(waitid(P_PID, leader, &info, WSTOPPED|WEXITED|WNOWAIT) == 0); # assert(info.si_pid == leader && info.si_status == 0x0405); # # /* OK, it sleeps in ptrace(PTRACE_EVENT_EXEC == 0x04) */ # assert(ptrace(PTRACE_CONT, leader, 0,0) == -1); # assert(errno == ESRCH); # # assert(leader == waitpid(leader, &status, WNOHANG)); # assert(status == 0x04057f); # # assert(ptrace(PTRACE_CONT, leader, 0,0) == 0); # # return 0; # } # # Signed-off-by: Oleg Nesterov # Reported-by: Simon Marchi # Acked-by: "Eric W. Biederman" # Acked-by: Pedro Alves # Acked-by: Simon Marchi # Acked-by: Jan Kratochvil # Signed-off-by: Linus Torvalds # < /opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux-gcc --version # < /opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux-ld --version # < git log --format=%s --max-count=1 dbb5afad100a828c97e012c6106566d99f041db6 # < make -s -j 120 ARCH=mips O=/kisskb/build/linus_mips-defconfig_mipsel CROSS_COMPILE=/opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux- defconfig # < make -s -j 120 ARCH=mips O=/kisskb/build/linus_mips-defconfig_mipsel CROSS_COMPILE=/opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux- help # make -s -j 120 ARCH=mips O=/kisskb/build/linus_mips-defconfig_mipsel CROSS_COMPILE=/opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux- olddefconfig # make -s -j 120 ARCH=mips O=/kisskb/build/linus_mips-defconfig_mipsel CROSS_COMPILE=/opt/cross/kisskb/br-mipsel-o32-full-2016.08-613-ge98b4dd/bin/mipsel-linux- FIT description: Linux 5.13.0-rc1-gdbb5afad100a Created: Thu May 13 05:00:09 2021 Image 0 (kernel) Description: Linux 5.13.0-rc1-gdbb5afad100a Created: Thu May 13 05:00:09 2021 Type: Kernel Image Compression: gzip compressed Data Size: 5350274 Bytes = 5224.88 KiB = 5.10 MiB Architecture: MIPS OS: Linux Load Address: 0x80100000 Entry Point: 0x809d08e8 Hash algo: sha1 Hash value: 193a613200bc440e0591a30ab6fdbd07c112a4c7 Image 1 (fdt-boston) Description: img,boston Device Tree Created: Thu May 13 05:00:09 2021 Type: Flat Device Tree Compression: uncompressed Data Size: 3793 Bytes = 3.70 KiB = 0.00 MiB Architecture: MIPS Hash algo: sha1 Hash value: 4799f50d688573234da6e9d7701234d394759ef4 Image 2 (fdt-ni169445) Description: NI 169445 device tree Created: Thu May 13 05:00:09 2021 Type: Flat Device Tree Compression: uncompressed Data Size: 1871 Bytes = 1.83 KiB = 0.00 MiB Architecture: MIPS Hash algo: sha1 Hash value: 51b89b31605ee62038c8468c429af091dfc75ec7 Image 3 (fdt-ocelot_pcb123) Description: MSCC Ocelot PCB123 Device Tree Created: Thu May 13 05:00:09 2021 Type: Flat Device Tree Compression: uncompressed Data Size: 4659 Bytes = 4.55 KiB = 0.00 MiB Architecture: MIPS Hash algo: sha1 Hash value: 5bcb6e4f21e8e5372544aa130b3bd097355a9050 Image 4 (fdt-ocelot_pcb120) Description: MSCC Ocelot PCB120 Device Tree Created: Thu May 13 05:00:09 2021 Type: Flat Device Tree Compression: uncompressed Data Size: 5418 Bytes = 5.29 KiB = 0.01 MiB Architecture: MIPS Hash algo: sha1 Hash value: 93d882f2009a217e0fa9dab94788535ed2be8476 Image 5 (fdt-xilfpga) Description: MIPSfpga (xilfpga) Device Tree Created: Thu May 13 05:00:09 2021 Type: Flat Device Tree Compression: uncompressed Data Size: 2708 Bytes = 2.64 KiB = 0.00 MiB Architecture: MIPS Hash algo: sha1 Hash value: 63d058b780f65e22da30f0a183433765f1807f1d Default Configuration: 'conf-default' Configuration 0 (conf-default) Description: Generic Linux kernel Kernel: kernel Configuration 1 (conf-boston) Description: Boston Linux kernel Kernel: kernel FDT: fdt-boston Configuration 2 (conf-ni169445) Description: NI 169445 Linux Kernel Kernel: kernel FDT: fdt-ni169445 Configuration 3 (conf-ocelot_pcb123) Description: Ocelot Linux kernel Kernel: kernel FDT: fdt-ocelot_pcb123 Configuration 4 (conf-ocelot_pcb120) Description: Ocelot Linux kernel Kernel: kernel FDT: fdt-ocelot_pcb120 Configuration 5 (conf-xilfpga) Description: MIPSfpga Linux kernel Kernel: kernel FDT: fdt-xilfpga Completed OK # rm -rf /kisskb/build/linus_mips-defconfig_mipsel # Build took: 0:01:04.757124