diff options
author | Eitan Adler <eadler@FreeBSD.org> | 2012-05-30 03:55:44 +0000 |
---|---|---|
committer | Eitan Adler <eadler@FreeBSD.org> | 2012-05-30 03:55:44 +0000 |
commit | 35f8ab70be58c726fec4b0156cd9ec880462482a (patch) | |
tree | 7630bcd74112512560d6d9b409c3d88da80a8c8f /usr.bin/mail | |
parent | 5e4cc10b6dec05c39ecec0eadd66dfc16b01a0d5 (diff) | |
download | src-test-35f8ab70be58c726fec4b0156cd9ec880462482a.tar.gz src-test-35f8ab70be58c726fec4b0156cd9ec880462482a.zip |
Fix likely race condition if wait_child() is interrupted by sigchild()
PR: bin/102834
Submitted by: Andreas Longwitz <longwitz@incore.de>
Approved by: cperciva
MFC after: 2 weeks
Notes
Notes:
svn path=/head/; revision=236286
Diffstat (limited to 'usr.bin/mail')
-rw-r--r-- | usr.bin/mail/popen.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/usr.bin/mail/popen.c b/usr.bin/mail/popen.c index 18bf7e5a3aa5b..c4d17461e48d8 100644 --- a/usr.bin/mail/popen.c +++ b/usr.bin/mail/popen.c @@ -336,12 +336,14 @@ int wait_child(int pid) { sigset_t nset, oset; - struct child *cp = findchild(pid); + struct child *cp; (void)sigemptyset(&nset); (void)sigaddset(&nset, SIGCHLD); (void)sigprocmask(SIG_BLOCK, &nset, &oset); + cp = findchild(pid); + while (!cp->done) (void)sigsuspend(&oset); wait_status = cp->status; |