|
From: Mark W. <ma...@so...> - 2021-03-09 17:54:36
|
https://sourceware.org/git/gitweb.cgi?p=valgrind.git;h=0f0205f683f70400406276936b1e0d1a7fa9cf72 commit 0f0205f683f70400406276936b1e0d1a7fa9cf72 Author: Mark Wielaard <ma...@kl...> Date: Tue Mar 9 18:51:57 2021 +0100 vgdb might crash if valgrind is killed This is an odd corner case, but happens specifically with the gdb testcase make check TESTS=gdb.base/valgrind-infcall-2.exp. At the end valgrind gets killed with SIGKILL (-9) which cannot be blocked. But vgdb at the time is inside waitstopped. It sees the process wasn't exited (WIFEXITED(status) is false) and so assumes the process was stopped by a signal. Which it asserts: assert (WIFSTOPPED(status)); signal_received = WSTOPSIG(status); if (signal_received == signal_expected) break; But the assert fails and vgdb dumps core. The gdb testcase doesn't care, because it already finished its test and just makes sure all processes are gone. But it slowly fills your disk with core files (if you have enabled them) when running the testsuite. The fix is to simply check first whether the program has termined normally or by getting a fatal signal. https://bugs.kde.org/show_bug.cgi?id=434035 Diff: --- NEWS | 1 + coregrind/vgdb-invoker-ptrace.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d1bf7b09f2..cd8a509faa 100644 --- a/NEWS +++ b/NEWS @@ -356,6 +356,7 @@ where XXXXXX is the bug number as listed below. 419503 s390x: Avoid modifying registers returned from isel functions 421321 gcc10 arm64 build needs __getauxval for linking with libgcc 421570 std_mutex fails on Arm v8.1 h/w +434035 vgdb might crash if valgrind is killed n-i-bz Fix minor one time leaks in dhat. n-i-bz Add --run-cxx-freeres=no in outer args to avoid inner crashes. n-i-bz Add support for the Linux io_uring system calls diff --git a/coregrind/vgdb-invoker-ptrace.c b/coregrind/vgdb-invoker-ptrace.c index cb37677d5c..389748960f 100644 --- a/coregrind/vgdb-invoker-ptrace.c +++ b/coregrind/vgdb-invoker-ptrace.c @@ -267,7 +267,8 @@ Bool waitstopped (pid_t pid, int signal_expected, const char *msg) return False; } - if (WIFEXITED(status)) { + /* The process either exited or was terminated by a (fatal) signal. */ + if (WIFEXITED(status) || WIFSIGNALED(status)) { shutting_down = True; return False; } |