sys.kern.pdeathsig.signal_delivered_ptrace: fix startup.
Inform D that C executed procctl(PROC_PDEATHSIG_CTL). Otherwise D might allow B to exit before C is set up to receive a signal on the parent exit. In this case, C waits forever for the signal and test hangs. PR: 237657 Reported and tested by: lwhsu Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
39ba52c0b7
commit
de567a4bef
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=351211
@ -229,6 +229,7 @@ ATF_TC_BODY(signal_delivered_ptrace, tc)
|
|||||||
int rc;
|
int rc;
|
||||||
int pipe_ca[2];
|
int pipe_ca[2];
|
||||||
int pipe_db[2];
|
int pipe_db[2];
|
||||||
|
int pipe_cd[2];
|
||||||
char buffer;
|
char buffer;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
@ -236,6 +237,8 @@ ATF_TC_BODY(signal_delivered_ptrace, tc)
|
|||||||
ATF_REQUIRE(rc == 0);
|
ATF_REQUIRE(rc == 0);
|
||||||
rc = pipe(pipe_db);
|
rc = pipe(pipe_db);
|
||||||
ATF_REQUIRE(rc == 0);
|
ATF_REQUIRE(rc == 0);
|
||||||
|
rc = pipe(pipe_cd);
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
rc = fork();
|
rc = fork();
|
||||||
ATF_REQUIRE(rc != -1);
|
ATF_REQUIRE(rc != -1);
|
||||||
@ -263,6 +266,9 @@ ATF_TC_BODY(signal_delivered_ptrace, tc)
|
|||||||
rc = procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum);
|
rc = procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
|
|
||||||
|
rc = write(pipe_cd[1], "x", 1);
|
||||||
|
assert(rc == 1);
|
||||||
|
|
||||||
/* wait for B to die and signal us... */
|
/* wait for B to die and signal us... */
|
||||||
signum = 0xdeadbeef;
|
signum = 0xdeadbeef;
|
||||||
rc = sigwait(&sigset, &signum);
|
rc = sigwait(&sigset, &signum);
|
||||||
@ -293,6 +299,9 @@ ATF_TC_BODY(signal_delivered_ptrace, tc)
|
|||||||
rc = ptrace(PT_CONTINUE, c_pid, (caddr_t) 1, 0);
|
rc = ptrace(PT_CONTINUE, c_pid, (caddr_t) 1, 0);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
|
|
||||||
|
rc = read(pipe_cd[0], &buffer, 1);
|
||||||
|
assert(rc == 1);
|
||||||
|
|
||||||
/* tell B that we're ready for it to exit now */
|
/* tell B that we're ready for it to exit now */
|
||||||
rc = write(pipe_db[1], ".", 1);
|
rc = write(pipe_db[1], ".", 1);
|
||||||
assert(rc == 1);
|
assert(rc == 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user