summaryrefslogtreecommitdiffstats
path: root/tests/sys/kern
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2017-02-09 11:26:48 -0200
committerRenato Botelho <renato@netgate.com>2017-02-09 11:26:48 -0200
commit4a05f5440acda223e6a0ec5157bc32ecc0f09ff9 (patch)
tree4c2ece480e5d4155ed35bec62996de40eb179f18 /tests/sys/kern
parent681a482d8fc4bfc14a24f7a9d75cca6337f2a520 (diff)
parenta1e52233c91fd46e666297270ab655f1abff8535 (diff)
downloadFreeBSD-src-4a05f5440acda223e6a0ec5157bc32ecc0f09ff9.zip
FreeBSD-src-4a05f5440acda223e6a0ec5157bc32ecc0f09ff9.tar.gz
Merge remote-tracking branch 'origin/stable/10' into devel
Diffstat (limited to 'tests/sys/kern')
-rw-r--r--tests/sys/kern/acct/Makefile1
-rw-r--r--tests/sys/kern/execve/execve_helper.c2
-rw-r--r--tests/sys/kern/reaper.c102
3 files changed, 104 insertions, 1 deletions
diff --git a/tests/sys/kern/acct/Makefile b/tests/sys/kern/acct/Makefile
index 89bf3e0..98a316c 100644
--- a/tests/sys/kern/acct/Makefile
+++ b/tests/sys/kern/acct/Makefile
@@ -13,6 +13,7 @@ acct_test.o: convert.c
convert.c: ${.CURDIR:H:H:H:H}/sys/kern/kern_acct.c
sed -n -e 's/log(/syslog(/g' \
+ -e 's/exp/exponent/g' \
-e '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' ${.ALLSRC} >${.TARGET}.tmp
mv ${.TARGET}.tmp ${.TARGET}
diff --git a/tests/sys/kern/execve/execve_helper.c b/tests/sys/kern/execve/execve_helper.c
index 164a8f3..989b3e4 100644
--- a/tests/sys/kern/execve/execve_helper.c
+++ b/tests/sys/kern/execve/execve_helper.c
@@ -50,5 +50,5 @@ main(int argc, char **argv)
}
execve(argv[1], &argv[1], NULL);
- err(1, "");
+ err(1, "execve failed");
}
diff --git a/tests/sys/kern/reaper.c b/tests/sys/kern/reaper.c
index d11ee70..6031713 100644
--- a/tests/sys/kern/reaper.c
+++ b/tests/sys/kern/reaper.c
@@ -639,6 +639,107 @@ ATF_TC_BODY(reaper_kill_normal, tc)
ATF_REQUIRE_EQ(0, r);
}
+ATF_TC_WITHOUT_HEAD(reaper_kill_subtree);
+ATF_TC_BODY(reaper_kill_subtree, tc)
+{
+ struct procctl_reaper_kill params;
+ ssize_t sr;
+ pid_t parent, child1, child2, grandchild1, grandchild2, pid;
+ int r, status;
+ int pip[2];
+
+ parent = getpid();
+ r = procctl(P_PID, parent, PROC_REAP_ACQUIRE, NULL);
+ ATF_REQUIRE_EQ(0, r);
+
+ r = pipe(pip);
+ ATF_REQUIRE_EQ(0, r);
+ child1 = fork();
+ ATF_REQUIRE(child1 != -1);
+ if (child1 == 0) {
+ if (close(pip[0]) != 0)
+ _exit(100);
+ grandchild1 = fork();
+ if (grandchild1 == -1)
+ _exit(101);
+ if (grandchild1 == 0) {
+ if (write(pip[1], &(uint8_t){ 0 }, 1) != 1)
+ _exit(102);
+ for (;;)
+ pause();
+ }
+ for (;;)
+ pause();
+ }
+ child2 = fork();
+ ATF_REQUIRE(child2 != -1);
+ if (child2 == 0) {
+ if (close(pip[0]) != 0)
+ _exit(100);
+ grandchild2 = fork();
+ if (grandchild2 == -1)
+ _exit(101);
+ if (grandchild2 == 0) {
+ if (write(pip[1], &(uint8_t){ 0 }, 1) != 1)
+ _exit(102);
+ for (;;)
+ pause();
+ }
+ for (;;)
+ pause();
+ }
+ r = close(pip[1]);
+ ATF_REQUIRE_EQ(0, r);
+
+ sr = read(pip[0], &(uint8_t){ 0 }, 1);
+ ATF_REQUIRE_EQ(1, sr);
+ sr = read(pip[0], &(uint8_t){ 0 }, 1);
+ ATF_REQUIRE_EQ(1, sr);
+
+ params.rk_sig = SIGUSR1;
+ params.rk_flags = REAPER_KILL_SUBTREE;
+ params.rk_subtree = child1;
+ params.rk_killed = 77;
+ r = procctl(P_PID, parent, PROC_REAP_KILL, &params);
+ ATF_REQUIRE_EQ(0, r);
+ ATF_REQUIRE_EQ(2, params.rk_killed);
+ ATF_CHECK_EQ(-1, params.rk_fpid);
+
+ pid = waitpid(child1, &status, 0);
+ ATF_REQUIRE_EQ(child1, pid);
+ ATF_CHECK(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR1);
+
+ pid = waitpid(-1, &status, 0);
+ ATF_REQUIRE(pid > 0);
+ ATF_CHECK(pid != parent);
+ ATF_CHECK(pid != child1);
+ ATF_CHECK(pid != child2);
+ ATF_CHECK(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR1);
+
+ params.rk_sig = SIGUSR2;
+ params.rk_flags = REAPER_KILL_SUBTREE;
+ params.rk_subtree = child2;
+ params.rk_killed = 77;
+ r = procctl(P_PID, parent, PROC_REAP_KILL, &params);
+ ATF_REQUIRE_EQ(0, r);
+ ATF_REQUIRE_EQ(2, params.rk_killed);
+ ATF_CHECK_EQ(-1, params.rk_fpid);
+
+ pid = waitpid(child2, &status, 0);
+ ATF_REQUIRE_EQ(child2, pid);
+ ATF_CHECK(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR2);
+
+ pid = waitpid(-1, &status, 0);
+ ATF_REQUIRE(pid > 0);
+ ATF_CHECK(pid != parent);
+ ATF_CHECK(pid != child1);
+ ATF_CHECK(pid != child2);
+ ATF_CHECK(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR2);
+
+ r = close(pip[0]);
+ ATF_REQUIRE_EQ(0, r);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -652,5 +753,6 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, reaper_kill_sigzero);
ATF_TP_ADD_TC(tp, reaper_kill_empty);
ATF_TP_ADD_TC(tp, reaper_kill_normal);
+ ATF_TP_ADD_TC(tp, reaper_kill_subtree);
return (atf_no_error());
}
OpenPOWER on IntegriCloud