2013-06-18 20:50:18 +04:00
#!/bin/sh
2015-12-17 20:56:48 +03:00
#
2013-06-18 20:50:18 +04:00
# Ensure that strace can detach from stopped processes.
2015-12-17 20:56:48 +03:00
#
# Copyright (c) 2013-2015 Dmitry V. Levin <ldv@altlinux.org>
2018-12-25 02:46:43 +03:00
# Copyright (c) 2014-2018 The strace developers.
2015-12-17 20:56:48 +03:00
# All rights reserved.
#
2018-12-10 03:00:00 +03:00
# SPDX-License-Identifier: GPL-2.0-or-later
2013-06-18 20:50:18 +04:00
. "${srcdir=.}/init.sh"
2015-03-17 20:07:57 +03:00
run_prog_skip_if_failed \
kill -0 $$
2015-01-14 11:08:56 +03:00
2015-03-17 20:07:57 +03:00
$STRACE -d -enone / > /dev/null 2> "$LOG"
Consistently use error_msg instead of fprintf(stderr)
* linux/alpha/get_scno.c: Use error_msg.
* linux/arm/get_scno.c: Likewise.
* linux/mips/get_scno.c: Likewise.
* linux/sh/get_scno.c: Likewise.
* linux/x86_64/get_scno.c: Likewise.
* exit.c (sys_exit): Likewise.
* pathtrace.c (pathtrace_select, pathtrace_match): Likewise.
* strace.c (alloctcb, droptcb, detach, startup_attach,
test_ptrace_seize, init, cleanup, print_debug_info,
maybe_allocate_tcb, startup_tcb, trace): Likewise.
* syscall.c (update_personality, trace_syscall_exiting,
get_scno): Likewise.
* unwind.c (DPRINTF): Likewise.
* tests/bexecve.test: Update patterns.
* tests/detach-stopped.test: Likewise.
2015-05-26 01:51:19 +03:00
if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
2014-08-12 03:18:56 +04:00
skip_ "PTRACE_SEIZE doesn't work"
fi
2018-12-23 01:16:03 +03:00
check_prog sleep
trap - TERM
sleep $TIMEOUT_DURATION &
kill -TERM $!
wait $!
expected_rc=$?
2013-06-18 20:50:18 +04:00
set -e
2017-04-03 19:24:28 +03:00
> "$LOG"
tests: run every test except ksysent.test in its own subdirectory
Many test executables create temporary files in the current work
directory for the duration of their execution.
This level of test isolation allows more test executables to be invoked
several times simultaneously.
* tests/.gitignore: Add *.dir, remove *.log.*, *.tmp, *.tmp-*,
and *.tmp.* patterns.
* tests/Makefile.am (clean-local, clean-local-check): New rules.
(.PHONY): Add clean-local-check.
(CLEANFILES): Remove all but ksysent.h.
* tests/init.sh: Strip test-specific prefix from LOG, OUT, and EXP
variables. When invoked from a test, create a new test-specific
directory, chdir into it, and add more ../ prefix to STRACE variable.
(run_prog): Replace "./" with "../".
* tests/attach-f-p.test: Replace "./" with "../".
* tests/attach-p-cmd.test: Likewise.
* tests/bexecve.test: Likewise.
* tests/btrfs-v.test: Likewise.
* tests/btrfs-vw.test: Likewise.
* tests/btrfs-w.test: Likewise.
* tests/count.test: Likewise.
* tests/detach-running.test: Likewise.
* tests/detach-sleeping.test: Likewise.
* tests/detach-stopped.test: Likewise.
* tests/mmap.test: Likewise.
* tests/net-y-unix.test: Likewise.
* tests/net-yy-inet.test: Likewise.
* tests/net-yy-netlink.test: Likewise.
* tests/net-yy-unix.test: Likewise.
* tests/net.test: Likewise.
* tests/opipe.test: Likewise.
* tests/poll.test: Likewise.
* tests/prctl-seccomp-strict.test: Likewise.
* tests/qual_fault-exit_group.test: Likewise.
* tests/qual_fault.test: Likewise.
* tests/qual_inject-error-signal.test: Likewise.
* tests/qual_inject-retval.test: Likewise.
* tests/qual_inject-signal.test: Likewise.
* tests/qual_signal.test: Likewise.
* tests/qual_syscall.test: Likewise.
* tests/readv.test: Likewise.
* tests/redirect-fds.test: Likewise.
* tests/sched.test: Likewise.
* tests/scm_rights-fd.test: Likewise.
* tests/seccomp-strict.test: Likewise.
* tests/strace-C.test: Likewise.
* tests/strace-E.expected: Likewise.
* tests/strace-E.test: Likewise.
* tests/strace-S.test: Likewise.
* tests/strace-T.test: Likewise.
* tests/strace-V.test: Likewise.
* tests/strace-ff.test: Likewise.
* tests/strace-k.test: Likewise.
* tests/strace-r.expected: Likewise.
* tests/strace-r.test: Likewise.
* tests/strace-t.test: Likewise.
* tests/strace-tt.test: Likewise.
* tests/strace-ttt.test: Likewise.
* tests/sun_path.test: Likewise.
* tests/uname.test: Likewise.
* tests/unix-pair-send-recv.test: Likewise.
* tests/unix-pair-sendto-recvfrom.test: Likewise.
2017-04-02 04:03:24 +03:00
../set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &
2013-06-18 20:50:18 +04:00
2015-03-17 20:07:57 +03:00
while ! [ -s "$LOG" ]; do
2013-06-18 20:50:18 +04:00
kill -0 $! 2> /dev/null ||
fail_ 'set_ptracer_any sleep failed'
2013-06-19 00:51:49 +04:00
$SLEEP_A_BIT
2013-06-18 20:50:18 +04:00
done
tracee_pid=$!
kill -STOP $tracee_pid
cleanup()
{
set +e
kill $tracee_pid
kill -CONT $tracee_pid
wait $tracee_pid 2> /dev/null
2014-08-11 09:31:23 +04:00
return 0
2013-06-18 20:50:18 +04:00
}
2017-04-03 19:24:28 +03:00
> "$LOG"
2015-03-17 20:07:57 +03:00
$STRACE -p $tracee_pid 2> "$LOG" &
2013-06-18 20:50:18 +04:00
2015-03-17 20:07:57 +03:00
while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
kill -0 $! 2> /dev/null || {
cleanup
dump_log_and_fail_with "$STRACE -p failed to attach"
}
2013-06-19 00:51:49 +04:00
$SLEEP_A_BIT
2013-06-18 20:50:18 +04:00
done
2015-03-17 20:07:57 +03:00
while ! grep -F -e '--- stopped by ' "$LOG" > /dev/null; do
kill -0 $! 2> /dev/null || {
cleanup
dump_log_and_fail_with "$STRACE -p missed stop notifications"
}
2013-06-19 00:51:49 +04:00
$SLEEP_A_BIT
2013-06-18 20:50:18 +04:00
done
2018-12-23 01:16:03 +03:00
kill -TERM $!
wait $! && rc=0 || rc=$?
2013-06-18 20:50:18 +04:00
2015-03-17 20:07:57 +03:00
grep -F "Process $tracee_pid detached" "$LOG" > /dev/null || {
cleanup
dump_log_and_fail_with "$STRACE -p failed to detach"
}
2013-06-18 20:50:18 +04:00
2018-12-23 01:16:03 +03:00
[ "$rc" = "$expected_rc" ] || {
cleanup
dump_log_and_fail_with "$STRACE -p failed to terminate itself"
}
2013-06-19 18:57:05 +04:00
if [ -f /proc/self/status ]; then
$SLEEP_A_BIT
2015-03-17 20:07:57 +03:00
test -d /proc/$tracee_pid || {
cleanup
dump_log_and_fail_with 'tracee died after detach'
}
2016-12-13 22:59:47 +03:00
grep_pid_status "$tracee_pid" '^State:.*T (stopped)' > /dev/null || {
grep_pid_status "$tracee_pid" '^State:'
2013-06-19 18:57:05 +04:00
cleanup
2015-03-17 20:07:57 +03:00
dump_log_and_fail_with 'tracee is not group-stopped after detach'
2013-06-19 18:37:24 +04:00
}
2013-06-19 18:57:05 +04:00
fi
2013-06-19 18:37:24 +04:00
2013-06-18 20:50:18 +04:00
cleanup
exit 0