freebsd-dev/bin
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
..
cat Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
chflags Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
chio Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
chmod Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
cp Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
csh WITH_META_MODE: Fix bin/csh rebuilding tc.const.h 2016-06-14 16:19:49 +00:00
date Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
dd dd(1): Enable access to SIZE_T_MAX character devices 2016-07-09 17:11:54 +00:00
df Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
domainname Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
echo Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
ed Close the input FILE * in read_file() and the output FILE * in write_file() 2016-05-25 18:38:30 +00:00
expr Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
freebsd-version MFH 2016-04-04 23:55:32 +00:00
getfacl Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
hostname Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
kenv Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
kill Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
ln Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
ls Use require.progs with bc instead of require.files with /usr/bin/bc 2016-05-29 04:50:49 +00:00
mkdir Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
mv Close from_fd if malloc() fails to avoid a file descriptor leak. 2016-05-25 02:51:15 +00:00
pax Rename getline with get_line to avoid collision with getline(3) 2016-05-10 11:11:23 +00:00
pkill Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
ps When a debugger attaches to the process, SIGSTOP is sent to the 2016-07-28 08:41:13 +00:00
pwait Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
pwd Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
rcp MFH 2016-04-12 17:00:13 +00:00
realpath Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
rm Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
rmail MFH 2016-03-02 16:14:46 +00:00
rmdir Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
setfacl Explicitly NUL terminate the buffer filled by fread(). 2016-06-08 05:32:39 +00:00
sh Path generation was not according to collate 2016-07-16 13:26:18 +00:00
sleep Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
stty Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
sync Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
test Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
tests Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
uuidgen Explicitly add unmarked bin/ binaries to the runtime package. 2016-02-09 16:58:50 +00:00
Makefile Start using the fact that SUBDIR.yes is added to SUBDIR 2015-10-05 21:41:55 +00:00
Makefile.inc Use src.opts.mk in preference to bsd.own.mk except where we need stuff 2014-05-06 04:22:01 +00:00