diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 50de73244077..fcdb29eee89b 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -423,8 +423,22 @@ fork1(td, flags, pages, procp) AUDIT_ARG(pid, p2->p_pid); LIST_INSERT_HEAD(&allproc, p2, p_list); LIST_INSERT_HEAD(PIDHASH(p2->p_pid), p2, p_hash); + + PROC_LOCK(p2); + PROC_LOCK(p1); + sx_xunlock(&allproc_lock); + bcopy(&p1->p_startcopy, &p2->p_startcopy, + __rangeof(struct proc, p_startcopy, p_endcopy)); + PROC_UNLOCK(p1); + + bzero(&p2->p_startzero, + __rangeof(struct proc, p_startzero, p_endzero)); + + p2->p_ucred = crhold(td->td_ucred); + PROC_UNLOCK(p2); + /* * Malloc things while we don't hold any locks. */ @@ -482,13 +496,9 @@ fork1(td, flags, pages, procp) PROC_LOCK(p2); PROC_LOCK(p1); - bzero(&p2->p_startzero, - __rangeof(struct proc, p_startzero, p_endzero)); bzero(&td2->td_startzero, __rangeof(struct thread, td_startzero, td_endzero)); - bcopy(&p1->p_startcopy, &p2->p_startcopy, - __rangeof(struct proc, p_startcopy, p_endcopy)); bcopy(&td->td_startcopy, &td2->td_startcopy, __rangeof(struct thread, td_startcopy, td_endcopy)); @@ -511,7 +521,6 @@ fork1(td, flags, pages, procp) sched_fork(td, td2); mtx_unlock_spin(&sched_lock); - p2->p_ucred = crhold(td->td_ucred); td2->td_ucred = crhold(p2->p_ucred); #ifdef AUDIT audit_proc_fork(p1, p2); diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index efce45bdc035..3bd76f3c382a 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -143,6 +143,9 @@ getpriority(td, uap) uap->who = td->td_ucred->cr_uid; sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { + /* Do not bother to check PRS_NEW processes */ + if (p->p_state == PRS_NEW) + continue; PROC_LOCK(p); if (!p_cansee(td, p) && p->p_ucred->cr_uid == uap->who) {