diff options
author | Mark Johnston <markj@FreeBSD.org> | 2018-10-16 20:06:56 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2018-10-16 20:06:56 +0000 |
commit | ddab8c351a1c652d8af1e6e4702ce3b81a8f5ae6 (patch) | |
tree | ba6196878e3b072a97b2cca8a91eaee676d52e16 /tests | |
parent | a38abbfb007c0408ba9588620d4cef566acc5520 (diff) | |
download | src-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.c | 36 |
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()); } |