summaryrefslogtreecommitdiff
path: root/sys/kern/tty.c
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2011-04-03 14:56:29 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2011-04-03 14:56:29 +0000
commit445a93dfa951cfdb8d9253fd13836d6a25a4ac4b (patch)
tree9248ed7a9eb63023a13f069c04bd049ee460f416 /sys/kern/tty.c
parente3f9e42db6dd7e48f8bd5a3da7d5b2bb44f3752f (diff)
Move PPWAIT flag from struct proc to process, so that rthreads in
a vforked child behave correctly. Have the parent in a vfork() wait on a (different) flag in *its* process instead of the child to prevent a possible use-after-free. When ktracing the child return from a fork, call it rfork if an rthread was created. ok blambert@
Diffstat (limited to 'sys/kern/tty.c')
-rw-r--r--sys/kern/tty.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index c8120bf02c6..5b3769ae34a 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.88 2010/07/26 01:56:27 guenther Exp $ */
+/* $OpenBSD: tty.c,v 1.89 2011/04/03 14:56:28 guenther Exp $ */
/* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */
/*-
@@ -749,7 +749,7 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case TIOCSLTC:
#endif
while (isbackground(pr, tp) &&
- (p->p_flag & P_PPWAIT) == 0 &&
+ (pr->ps_flags & PS_PPWAIT) == 0 &&
(p->p_sigignore & sigmask(SIGTTOU)) == 0 &&
(p->p_sigmask & sigmask(SIGTTOU)) == 0) {
if (pr->ps_pgrp->pg_jobc == 0)
@@ -1464,7 +1464,7 @@ loop: lflag = tp->t_lflag;
if (isbackground(pr, tp)) {
if ((p->p_sigignore & sigmask(SIGTTIN)) ||
(p->p_sigmask & sigmask(SIGTTIN)) ||
- p->p_flag & P_PPWAIT || pr->ps_pgrp->pg_jobc == 0) {
+ pr->ps_flags & PS_PPWAIT || pr->ps_pgrp->pg_jobc == 0) {
error = EIO;
goto out;
}
@@ -1718,7 +1718,7 @@ loop:
p = curproc;
pr = p->p_p;
if (isbackground(pr, tp) &&
- ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
+ ISSET(tp->t_lflag, TOSTOP) && (pr->ps_flags & PS_PPWAIT) == 0 &&
(p->p_sigignore & sigmask(SIGTTOU)) == 0 &&
(p->p_sigmask & sigmask(SIGTTOU)) == 0) {
if (pr->ps_pgrp->pg_jobc == 0) {