git: 29887e602b6e - stable/13 - truss(1): detach more carefully
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 19 Jan 2022 00:46:14 UTC
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=29887e602b6e00d886348f3a5a65dc0070a7d7ef
commit 29887e602b6e00d886348f3a5a65dc0070a7d7ef
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2022-01-12 08:21:19 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2022-01-19 00:46:08 +0000
truss(1): detach more carefully
(cherry picked from commit 12f747e6ff675edfc1f2f95f7fc435dc01e0c29c)
---
usr.bin/truss/setup.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c
index 78be0c7f570f..d98e618d9c43 100644
--- a/usr.bin/truss/setup.c
+++ b/usr.bin/truss/setup.c
@@ -223,11 +223,24 @@ restore_proc(int signo __unused)
static void
detach_proc(pid_t pid)
{
+ int sig, status;
- /* stop the child so that we can detach */
+ /*
+ * Stop the child so that we can detach. Filter out possible
+ * lingering SIGTRAP events buffered in the threads.
+ */
kill(pid, SIGSTOP);
- if (waitpid(pid, NULL, 0) < 0)
- err(1, "Unexpected stop in waitpid");
+ for (;;) {
+ if (waitpid(pid, &status, 0) < 0)
+ err(1, "Unexpected error in waitpid");
+ sig = WIFSTOPPED(status) ? WSTOPSIG(status) : 0;
+ if (sig == SIGSTOP)
+ break;
+ if (sig == SIGTRAP)
+ sig = 0;
+ if (ptrace(PT_CONTINUE, pid, (caddr_t)1, sig) < 0)
+ err(1, "Can not continue for detach");
+ }
if (ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0)
err(1, "Can not detach the process");