svn commit: r303430 - user/pho/stress2/misc
Peter Holm
pho at FreeBSD.org
Thu Jul 28 11:05:30 UTC 2016
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 at 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 at 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
More information about the svn-src-user
mailing list