git: 653738e895ba - main - ptrace: Clear TDB_BORN during PT_DETACH.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 07 Jun 2023 19:29:01 UTC
The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=653738e895ba022be1179a95a85089e7bc66dbbe commit 653738e895ba022be1179a95a85089e7bc66dbbe Author: John Baldwin <jhb@FreeBSD.org> AuthorDate: 2023-06-07 19:26:57 +0000 Commit: John Baldwin <jhb@FreeBSD.org> CommitDate: 2023-06-07 19:28:36 +0000 ptrace: Clear TDB_BORN during PT_DETACH. If a debugger detaches from a process that has a new thread that has not yet executed, the new thread will raise a SIGTRAP signal to report it's thread birth event even after the detach. With the debugger detached, this results in a SIGTRAP sent to the process and typically a core dump. Fix this by clearing TDB_BORN from any new threads during detach. Bump __FreeBSD_version for debuggers to notice when the fix is present. Reported by: GDB's testsuite Reviewed by: kib, markj (previous version) Differential Revision: https://reviews.freebsd.org/D39856 --- sys/kern/kern_fork.c | 2 +- sys/kern/sys_process.c | 2 +- sys/sys/param.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index f981747aaf70..944ecf494736 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1144,7 +1144,7 @@ fork_return(struct thread *td, struct trapframe *frame) td->td_dbgflags &= ~TDB_STOPATFORK; } PROC_UNLOCK(p); - } else if (p->p_flag & P_TRACED || td->td_dbgflags & TDB_BORN) { + } else if (p->p_flag & P_TRACED) { /* * This is the start of a new thread in a traced * process. Report a system call exit event. diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 47fdf91b87d5..41434da783c8 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -1288,7 +1288,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) SIGSTOP); } td3->td_dbgflags &= ~(TDB_XSIG | TDB_FSTP | - TDB_SUSPEND); + TDB_SUSPEND | TDB_BORN); } if ((p->p_flag2 & P2_PTRACE_FSTP) != 0) { diff --git a/sys/sys/param.h b/sys/sys/param.h index 5bdc3e2ebee4..d3577411e998 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -76,7 +76,7 @@ * cannot include sys/param.h and should only be updated here. */ #undef __FreeBSD_version -#define __FreeBSD_version 1400089 +#define __FreeBSD_version 1400090 /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,