summaryrefslogtreecommitdiff
path: root/usr.bin/mail
diff options
context:
space:
mode:
authorEitan Adler <eadler@FreeBSD.org>2012-05-30 03:55:44 +0000
committerEitan Adler <eadler@FreeBSD.org>2012-05-30 03:55:44 +0000
commit35f8ab70be58c726fec4b0156cd9ec880462482a (patch)
tree7630bcd74112512560d6d9b409c3d88da80a8c8f /usr.bin/mail
parent5e4cc10b6dec05c39ecec0eadd66dfc16b01a0d5 (diff)
downloadsrc-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.c4
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;