freebsd-skq/bin/ps
Konstantin Belousov b7a25e63b6 When a debugger attaches to the process, SIGSTOP is sent to the
target.  Due to a way issignal() selects the next signal to deliver
and report, if the simultaneous or already pending another signal
exists, that signal might be reported by the next waitpid(2) call.
This causes minor annoyance for debuggers, which must be prepared to
take any signal as the first event, then filter SIGSTOP later.

More importantly, for tools like gcore(1), which attach and then
detach without processing events, SIGSTOP might leak to be delivered
after PT_DETACH.  This results in the process being unintentionally
stopped after detach, which is fatal for automatic tools.

The solution is to force SIGSTOP to be the first signal reported after
the attach.  Attach code is modified to set P2_PTRACE_FSTP to indicate
that the attaching ritual was not yet finished, and issignal() prefers
SIGSTOP in that condition.  Also, the thread which handles
P2_PTRACE_FSTP is made to guarantee to own p_xthread during the first
waitpid(2).  All that ensures that SIGSTOP is consumed first.

Additionally, if P2_PTRACE_FSTP is still set on detach, which means
that waitpid(2) was not called at all, SIGSTOP is removed from the
queue, ensuring that the process is resumed on detach.

In issignal(), when acting on STOPing signals, remove the signal from
queue before suspending.  Otherwise parallel attach could result in
ptracestop() acting on that STOP as if it was the STOP signal from the
attach.  Then SIGSTOP from attach leaks again.

As a minor refactoring, some bits of the common attach code is moved
to new helper proc_set_traced().

Reported by:	markj
Reviewed by:	jhb, markj
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
Differential revision:	https://reviews.freebsd.org/D7256
2016-07-28 08:41:13 +00:00
..
extern.h Include the thread name along with the command name when displaying the 2013-01-18 18:24:40 +00:00
fmt.c - Move 'showthreads' check out of fmt.c. 2013-01-19 00:21:55 +00:00
keyword.c ps(1): Expand variables to match expanded fields 2016-06-01 19:54:05 +00:00
Makefile Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
Makefile.depend Update dependencies after r291406 added libelf to libkvm. 2015-12-01 05:18:48 +00:00
nlist.c
print.c ps(1): Expand variables to match expanded fields 2016-06-01 19:54:05 +00:00
ps.1 When a debugger attaches to the process, SIGSTOP is sent to the 2016-07-28 08:41:13 +00:00
ps.c Addm missed required call to xo_finish() when only header is printed. 2016-07-23 06:30:00 +00:00
ps.h Fix CID 1011370 (Resource leak) in ps. 2016-05-25 05:12:56 +00:00