Date: Thu, 28 Jul 2016 11:05:26 +0000 (UTC) From: Peter Holm <pho@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r303430 - user/pho/stress2/misc Message-ID: <201607281105.u6SB5Q0N011144@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pho Date: Thu Jul 28 11:05:26 2016 New Revision: 303430 URL: https://svnweb.freebsd.org/changeset/base/303430 Log: Added two regression tests. Submitted by: markj Sponsored by: EMC / Isilon Storage Division Added: user/pho/stress2/misc/ptrace10.sh (contents, props changed) user/pho/stress2/misc/ptrace9.sh (contents, props changed) Added: user/pho/stress2/misc/ptrace10.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/pho/stress2/misc/ptrace10.sh Thu Jul 28 11:05:26 2016 (r303430) @@ -0,0 +1,136 @@ +#!/bin/sh + +# ptrace(2) test scenario by Mark Johnston <markj@FreeBSD.org> +# 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 <<EOF +#include <sys/types.h> +#include <sys/ptrace.h> +#include <sys/wait.h> + +#include <err.h> +#include <pthread.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +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 Added: user/pho/stress2/misc/ptrace9.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/pho/stress2/misc/ptrace9.sh Thu Jul 28 11:05:26 2016 (r303430) @@ -0,0 +1,106 @@ +#!/bin/sh + +# ptrace(2) test scenario by Mark Johnston <markj@FreeBSD.org> +# https://people.freebsd.org/~markj/ptrace_stop.c +# Fixed by r303423. + +. ../default.cfg + +cd /tmp +cat > ptrace9.c <<EOF +#include <sys/types.h> +#include <sys/ptrace.h> +#include <sys/wait.h> + +#include <err.h> +#include <signal.h> +#include <stdio.h> +#include <unistd.h> + +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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607281105.u6SB5Q0N011144>