aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2018-10-16 20:06:56 +0000
committerMark Johnston <markj@FreeBSD.org>2018-10-16 20:06:56 +0000
commitddab8c351a1c652d8af1e6e4702ce3b81a8f5ae6 (patch)
treeba6196878e3b072a97b2cca8a91eaee676d52e16 /tests
parenta38abbfb007c0408ba9588620d4cef566acc5520 (diff)
downloadsrc-ddab8c351a1c652d8af1e6e4702ce3b81a8f5ae6.tar.gz
src-ddab8c351a1c652d8af1e6e4702ce3b81a8f5ae6.zip
Reparent a child of pdfork(2) to its reaper when the procdesc is closed.
Unconditionally reparenting to PID 1 breaks the procctl(2) reaper functionality. Add a regression test for this case. Reviewed by: kib Approved by: re (gjb) MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D17589
Notes
Notes: svn path=/head/; revision=339390
Diffstat (limited to 'tests')
-rw-r--r--tests/sys/kern/reaper.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/tests/sys/kern/reaper.c b/tests/sys/kern/reaper.c
index 603171334435..d85513882553 100644
--- a/tests/sys/kern/reaper.c
+++ b/tests/sys/kern/reaper.c
@@ -28,6 +28,7 @@
__FBSDID("$FreeBSD$");
#include <sys/procctl.h>
+#include <sys/procdesc.h>
#include <sys/wait.h>
#include <atf-c.h>
@@ -740,6 +741,40 @@ ATF_TC_BODY(reaper_kill_subtree, tc)
ATF_REQUIRE_EQ(0, r);
}
+ATF_TC_WITHOUT_HEAD(reaper_pdfork);
+ATF_TC_BODY(reaper_pdfork, tc)
+{
+ struct procctl_reaper_status st;
+ pid_t child, grandchild, parent, pid;
+ int pd, r, status;
+
+ parent = getpid();
+ r = procctl(P_PID, parent, PROC_REAP_ACQUIRE, NULL);
+ ATF_REQUIRE_EQ(r, 0);
+
+ child = pdfork(&pd, 0);
+ ATF_REQUIRE(child != -1);
+ if (child == 0) {
+ grandchild = pdfork(&pd, 0);
+ if (grandchild == -1)
+ _exit(1);
+ if (grandchild == 0)
+ pause();
+ _exit(0);
+ }
+ pid = waitpid(child, &status, 0);
+ ATF_REQUIRE_EQ(pid, child);
+ r = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
+ ATF_REQUIRE_EQ(r, 0);
+
+ r = procctl(P_PID, parent, PROC_REAP_STATUS, &st);
+ ATF_REQUIRE_EQ(r, 0);
+ ATF_CHECK((st.rs_flags & REAPER_STATUS_OWNED) != 0);
+ ATF_CHECK(st.rs_reaper == parent);
+ ATF_CHECK(st.rs_children == 1);
+ ATF_CHECK(st.rs_descendants == 1);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -754,5 +789,6 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, reaper_kill_empty);
ATF_TP_ADD_TC(tp, reaper_kill_normal);
ATF_TP_ADD_TC(tp, reaper_kill_subtree);
+ ATF_TP_ADD_TC(tp, reaper_pdfork);
return (atf_no_error());
}