Page MenuHomeFreeBSD

D49678.id153714.diff
No OneTemporary

D49678.id153714.diff

diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -115,6 +115,8 @@
static struct thread *sigtd(struct proc *p, int sig, bool fast_sigblock);
static void sigqueue_start(void);
static void sigfastblock_setpend(struct thread *td, bool resched);
+static void sig_handle_fstp(struct thread *td, struct proc *p, int sig,
+ bool ext);
static uma_zone_t ksiginfo_zone = NULL;
const struct filterops sig_filtops = {
@@ -2363,6 +2365,15 @@
if (prop & SIGPROP_CONT)
sigqueue_delete_stopmask_proc(p);
else if (prop & SIGPROP_STOP) {
+ if ((p->p_flag & P_TRACED) != 0 &&
+ (p->p_flag2 & P2_PTRACE_FSTP) != 0) {
+ td->td_dbgflags |= TDB_FSTP;
+ PROC_SLOCK(p);
+ sig_handle_fstp(td, p, sig, true);
+ PROC_SUNLOCK(p);
+ return (0);
+ }
+
/*
* If sending a tty stop signal to a member of an orphaned
* process group, discard the signal here if the action
@@ -2820,6 +2831,29 @@
}
}
+static void
+sig_handle_fstp(struct thread *td, struct proc *p, int sig, bool ext)
+{
+ if ((td->td_dbgflags & TDB_FSTP) == 0 &&
+ ((p->p_flag2 & P2_PTRACE_FSTP) != 0 ||
+ p->p_xthread != NULL))
+ return;
+
+ p->p_xsig = sig;
+ p->p_xthread = td;
+
+ /*
+ * If we are on sleepqueue already, let sleepqueue
+ * code decide if it needs to go sleep after attach.
+ */
+ if (ext || td->td_wchan == NULL)
+ td->td_dbgflags &= ~TDB_FSTP;
+
+ p->p_flag2 &= ~P2_PTRACE_FSTP;
+ p->p_flag |= P_STOPPED_SIG | P_STOPPED_TRACE;
+ sig_suspend_threads(td, p);
+}
+
/*
* Stop the process for an event deemed interesting to the debugger. If si is
* non-NULL, this is a signal exchange; the new signal requested by the
@@ -2880,24 +2914,8 @@
* already set p_xthread, the current thread will get
* a chance to report itself upon the next iteration.
*/
- if ((td->td_dbgflags & TDB_FSTP) != 0 ||
- ((p->p_flag2 & P2_PTRACE_FSTP) == 0 &&
- p->p_xthread == NULL)) {
- p->p_xsig = sig;
- p->p_xthread = td;
+ sig_handle_fstp(td, p, sig, false);
- /*
- * If we are on sleepqueue already,
- * let sleepqueue code decide if it
- * needs to go sleep after attach.
- */
- if (td->td_wchan == NULL)
- td->td_dbgflags &= ~TDB_FSTP;
-
- p->p_flag2 &= ~P2_PTRACE_FSTP;
- p->p_flag |= P_STOPPED_SIG | P_STOPPED_TRACE;
- sig_suspend_threads(td, p);
- }
if ((td->td_dbgflags & TDB_STOPATFORK) != 0) {
td->td_dbgflags &= ~TDB_STOPATFORK;
}
@@ -3336,6 +3354,7 @@
}
}
+#if 0
if ((p->p_flag & (P_TRACED | P_PPTRACE)) == P_TRACED &&
(p->p_flag2 & P2_PTRACE_FSTP) != 0 &&
SIGISMEMBER(sigpending, SIGSTOP)) {
@@ -3349,6 +3368,7 @@
SIGEMPTYSET(sigpending);
SIGADDSET(sigpending, SIGSTOP);
}
+#endif
SIG_FOREACH(sig, &sigpending) {
switch (sigprocess(td, sig)) {

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 8, 4:37 PM (6 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28474246
Default Alt Text
D49678.id153714.diff (2 KB)

Event Timeline