Index: user/pho/stress2/misc/ptrace10.sh =================================================================== --- user/pho/stress2/misc/ptrace10.sh (nonexistent) +++ user/pho/stress2/misc/ptrace10.sh (revision 303430) @@ -0,0 +1,136 @@ +#!/bin/sh + +# ptrace(2) test scenario by Mark Johnston +# https://people.freebsd.org/~markj/ptrace_stop_mt.c +# Fixed by r303423. + +# stopped on signal 17 after detach +# UID PID PPID CPU PRI NI VSZ RSS MWCHAN STAT TT TIME COMMAND +# 1001 47125 62778 0 52 0 6568 2456 wait S+ 2 0:00.01 /bin/sh ./ptrace10.sh +# 1001 47146 47125 0 23 0 6108 1928 nanslp S+ 2 0:00.00 ./ptrace10 +# 1001 47148 47146 0 24 0 6240 1932 - T+ 2 0:00.00 ./ptrace10 +# 1001 47148 47146 0 24 0 6240 1932 - T+ 2 0:00.00 ./ptrace10 + +. ../default.cfg + +cd /tmp +cat > ptrace10.c < +#include +#include + +#include +#include +#include +#include +#include +#include + +static void +sighup(int sig __unused) +{ +} + +static void +sleep_forever(void) +{ + + while (1) + sleep(1); +} + +static void * +thread(void *arg __unused) +{ + + sleep_forever(); + return (NULL); +} + +int +main(void) +{ + struct sigaction act; + sigset_t set; + pthread_t t; + pid_t pid, ret; + int e, try, limit, r, status; + + e = 0; + pid = fork(); + if (pid < 0) + err(1, "fork"); + if (pid == 0) { + act.sa_handler = sighup; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + if (sigaction(SIGHUP, &act, NULL) != 0) + err(1, "sigaction"); + + r = pthread_create(&t, NULL, thread, NULL); + if (r != 0) + errc(1, r, "pthread_create"); + + /* Force SIGHUP to be delivered to the new thread. */ + sigemptyset(&set); + sigaddset(&set, SIGHUP); + r = pthread_sigmask(SIG_BLOCK, &set, NULL); + if (r != 0) + errc(1, r, "pthread_sigmask"); + + sleep_forever(); + } else { + sleep(1); /* give the child a chance to set itself up */ + + limit = 100; + for (try = 1; try <= limit; try++) { +// printf("attempt %d of %d\n", try, limit); + if (kill(pid, SIGHUP) != 0) + err(1, "kill(SIGHUP)"); + if (ptrace(PT_ATTACH, pid, NULL, 0) != 0) + err(1, "ptrace(PT_ATTACH)"); + if (waitpid(pid, &status, WUNTRACED) != pid) + err(1, "waitpid 1"); + if (!WIFSTOPPED(status)) + errx(1, "unexpected status %d after PT_ATTACH", + status); + if (ptrace(PT_DETACH, pid, NULL, 0) != 0) + err(1, "ptrace(PT_DETACH)"); + + sleep(1); + ret = waitpid(pid, &status, WUNTRACED | WNOHANG); + if (ret < 0) + err(1, "waitpid"); + if (ret == 0) + continue; + if (!WIFSTOPPED(status)) + errx(1, "unexpected status %d after PT_DETACH", + status); + printf("stopped on signal %d after detach\n", + WSTOPSIG(status)); + e = 1; +// sleep_forever(); + break; + } + } + kill(pid, SIGINT); + + return (e); +} +EOF + +mycc -o ptrace10 -Wall -Wextra -O2 -g ptrace10.c -lpthread || exit 1 +rm ptrace10.c + +./ptrace10 +s=$? +if [ $s -ne 0 ]; then + ps -lH | grep -v grep | egrep "UID|ptrace10" + while pgrep -q ptrace10; do + pkill -9 ptrace10 + done +fi +wait + +rm -f ptrace10 +exit $s Property changes on: user/pho/stress2/misc/ptrace10.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: user/pho/stress2/misc/ptrace9.sh =================================================================== --- user/pho/stress2/misc/ptrace9.sh (nonexistent) +++ user/pho/stress2/misc/ptrace9.sh (revision 303430) @@ -0,0 +1,106 @@ +#!/bin/sh + +# ptrace(2) test scenario by Mark Johnston +# https://people.freebsd.org/~markj/ptrace_stop.c +# Fixed by r303423. + +. ../default.cfg + +cd /tmp +cat > ptrace9.c < +#include +#include + +#include +#include +#include +#include + +static void +sigalrm(int sig __unused) +{ + _exit(0); +} + +static void +sighup(int sig __unused) +{ +} + +int +main(void) +{ + struct sigaction act; + pid_t pid; + int e, status; + + signal(SIGALRM, sigalrm); + e = 1; + pid = fork(); + if (pid < 0) + err(1, "fork"); + if (pid == 0) { + act.sa_handler = sighup; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + if (sigaction(SIGHUP, &act, NULL) != 0) + err(1, "sigaction"); + alarm(5); + while (1) { + sleep(1); + } + } else { + alarm(5); + sleep(1); /* give the child a chance to call sigaction */ + + if (kill(pid, SIGSTOP) != 0) + err(1, "kill(SIGSTOP)"); + + printf("waiting for child to stop...\n"); + if (waitpid(pid, &status, WUNTRACED) != pid) + err(1, "waitpid"); + if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP) + errx(1, "unexpected status %d after SIGSTOP", status); + + if (kill(pid, SIGHUP) != 0) + err(1, "kill(SIGHUP)"); + + if (ptrace(PT_ATTACH, pid, NULL, 0) != 0) + err(1, "ptrace(PT_ATTACH)"); + if (waitpid(pid, &status, WUNTRACED) != pid) + err(1, "waitpid"); + if (!WIFSTOPPED(status)) + errx(1, "unexpected status %d after PT_ATTACH", status); + printf("stopping signal is %d\n", WSTOPSIG(status)); + if (ptrace(PT_DETACH, pid, NULL, 0) != 0) + err(1, "ptrace(PT_DETACH)"); + + /* if ptrace works as expected, we'll block here */ + printf("waiting on child...\n"); fflush(stdout); + if (waitpid(pid, &status, WUNTRACED) != pid) + err(1, "waitpid"); + if (!WIFSTOPPED(status)) + errx(1, "unexpected status %d after PT_DETACH", status); + printf("child is stopped after detach (sig %d)\n", + WSTOPSIG(status)); fflush(stdout); + e = 1; + } + + return (e); +} +EOF + +mycc -o ptrace9 -Wall -Wextra -O2 -g ptrace9.c || exit 1 +rm ptrace9.c + +echo "Expect: + waiting for child to stop... + stopping signal is 17 + waiting on child..." +./ptrace9 +s=$? + +pkill -9 ptrace9 +rm -f ptrace9 +exit $s Property changes on: user/pho/stress2/misc/ptrace9.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property