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