xref: /freebsd/sys/kern/kern_exit.c (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
1 /*-
2  * Copyright (c) 1982, 1986, 1989, 1991, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 4. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *	@(#)kern_exit.c	8.7 (Berkeley) 2/12/94
35  */
36 
37 #include <sys/cdefs.h>
38 __FBSDID("$FreeBSD$");
39 
40 #include "opt_compat.h"
41 #include "opt_ktrace.h"
42 #include "opt_mac.h"
43 
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/sysproto.h>
47 #include <sys/eventhandler.h>
48 #include <sys/kernel.h>
49 #include <sys/malloc.h>
50 #include <sys/lock.h>
51 #include <sys/mutex.h>
52 #include <sys/proc.h>
53 #include <sys/pioctl.h>
54 #include <sys/tty.h>
55 #include <sys/wait.h>
56 #include <sys/vmmeter.h>
57 #include <sys/vnode.h>
58 #include <sys/resourcevar.h>
59 #include <sys/sbuf.h>
60 #include <sys/signalvar.h>
61 #include <sys/sched.h>
62 #include <sys/sx.h>
63 #include <sys/syscallsubr.h>
64 #include <sys/syslog.h>
65 #include <sys/ptrace.h>
66 #include <sys/acct.h>		/* for acct_process() function prototype */
67 #include <sys/filedesc.h>
68 #include <sys/shm.h>
69 #include <sys/sem.h>
70 #ifdef KTRACE
71 #include <sys/ktrace.h>
72 #endif
73 
74 #include <security/audit/audit.h>
75 #include <security/mac/mac_framework.h>
76 
77 #include <vm/vm.h>
78 #include <vm/vm_extern.h>
79 #include <vm/vm_param.h>
80 #include <vm/pmap.h>
81 #include <vm/vm_map.h>
82 #include <vm/vm_page.h>
83 #include <vm/uma.h>
84 
85 /* Required to be non-static for SysVR4 emulator */
86 MALLOC_DEFINE(M_ZOMBIE, "zombie", "zombie proc status");
87 
88 /* Hook for NFS teardown procedure. */
89 void (*nlminfo_release_p)(struct proc *p);
90 
91 /*
92  * exit -- death of process.
93  */
94 void
95 sys_exit(struct thread *td, struct sys_exit_args *uap)
96 {
97 
98 	exit1(td, W_EXITCODE(uap->rval, 0));
99 	/* NOTREACHED */
100 }
101 
102 /*
103  * Exit: deallocate address space and other resources, change proc state to
104  * zombie, and unlink proc from allproc and parent's lists.  Save exit status
105  * and rusage for wait().  Check for child processes and orphan them.
106  */
107 void
108 exit1(struct thread *td, int rv)
109 {
110 	struct proc *p, *nq, *q;
111 	struct tty *tp;
112 	struct vnode *ttyvp;
113 	struct vnode *vtmp;
114 #ifdef KTRACE
115 	struct vnode *tracevp;
116 	struct ucred *tracecred;
117 #endif
118 	struct plimit *plim;
119 	int locked;
120 
121 	mtx_assert(&Giant, MA_NOTOWNED);
122 
123 	p = td->td_proc;
124 	if (p == initproc) {
125 		printf("init died (signal %d, exit %d)\n",
126 		    WTERMSIG(rv), WEXITSTATUS(rv));
127 		panic("Going nowhere without my init!");
128 	}
129 
130 	/*
131 	 * MUST abort all other threads before proceeding past here.
132 	 */
133 	PROC_LOCK(p);
134 	while (p->p_flag & P_HADTHREADS) {
135 		/*
136 		 * First check if some other thread got here before us..
137 		 * if so, act apropriatly, (exit or suspend);
138 		 */
139 		thread_suspend_check(0);
140 
141 		/*
142 		 * Kill off the other threads. This requires
143 		 * some co-operation from other parts of the kernel
144 		 * so it may not be instantaneous.  With this state set
145 		 * any thread entering the kernel from userspace will
146 		 * thread_exit() in trap().  Any thread attempting to
147 		 * sleep will return immediately with EINTR or EWOULDBLOCK
148 		 * which will hopefully force them to back out to userland
149 		 * freeing resources as they go.  Any thread attempting
150 		 * to return to userland will thread_exit() from userret().
151 		 * thread_exit() will unsuspend us when the last of the
152 		 * other threads exits.
153 		 * If there is already a thread singler after resumption,
154 		 * calling thread_single will fail; in that case, we just
155 		 * re-check all suspension request, the thread should
156 		 * either be suspended there or exit.
157 		 */
158 		if (! thread_single(SINGLE_EXIT))
159 			break;
160 
161 		/*
162 		 * All other activity in this process is now stopped.
163 		 * Threading support has been turned off.
164 		 */
165 	}
166 	KASSERT(p->p_numthreads == 1,
167 	    ("exit1: proc %p exiting with %d threads", p, p->p_numthreads));
168 	/*
169 	 * Wakeup anyone in procfs' PIOCWAIT.  They should have a hold
170 	 * on our vmspace, so we should block below until they have
171 	 * released their reference to us.  Note that if they have
172 	 * requested S_EXIT stops we will block here until they ack
173 	 * via PIOCCONT.
174 	 */
175 	_STOPEVENT(p, S_EXIT, rv);
176 
177 	/*
178 	 * Note that we are exiting and do another wakeup of anyone in
179 	 * PIOCWAIT in case they aren't listening for S_EXIT stops or
180 	 * decided to wait again after we told them we are exiting.
181 	 */
182 	p->p_flag |= P_WEXIT;
183 	wakeup(&p->p_stype);
184 
185 	/*
186 	 * Wait for any processes that have a hold on our vmspace to
187 	 * release their reference.
188 	 */
189 	while (p->p_lock > 0)
190 		msleep(&p->p_lock, &p->p_mtx, PWAIT, "exithold", 0);
191 
192 	PROC_UNLOCK(p);
193 	/* Drain the limit callout while we don't have the proc locked */
194 	callout_drain(&p->p_limco);
195 
196 #ifdef AUDIT
197 	/*
198 	 * The Sun BSM exit token contains two components: an exit status as
199 	 * passed to exit(), and a return value to indicate what sort of exit
200 	 * it was.  The exit status is WEXITSTATUS(rv), but it's not clear
201 	 * what the return value is.
202 	 */
203 	AUDIT_ARG(exit, WEXITSTATUS(rv), 0);
204 	AUDIT_SYSCALL_EXIT(0, td);
205 #endif
206 
207 	/* Are we a task leader? */
208 	if (p == p->p_leader) {
209 		mtx_lock(&ppeers_lock);
210 		q = p->p_peers;
211 		while (q != NULL) {
212 			PROC_LOCK(q);
213 			psignal(q, SIGKILL);
214 			PROC_UNLOCK(q);
215 			q = q->p_peers;
216 		}
217 		while (p->p_peers != NULL)
218 			msleep(p, &ppeers_lock, PWAIT, "exit1", 0);
219 		mtx_unlock(&ppeers_lock);
220 	}
221 
222 	/*
223 	 * Check if any loadable modules need anything done at process exit.
224 	 * E.g. SYSV IPC stuff
225 	 * XXX what if one of these generates an error?
226 	 */
227 	EVENTHANDLER_INVOKE(process_exit, p);
228 
229 	/*
230 	 * If parent is waiting for us to exit or exec,
231 	 * P_PPWAIT is set; we will wakeup the parent below.
232 	 */
233 	PROC_LOCK(p);
234 	stopprofclock(p);
235 	p->p_flag &= ~(P_TRACED | P_PPWAIT);
236 
237 	/*
238 	 * Stop the real interval timer.  If the handler is currently
239 	 * executing, prevent it from rearming itself and let it finish.
240 	 */
241 	if (timevalisset(&p->p_realtimer.it_value) &&
242 	    callout_stop(&p->p_itcallout) == 0) {
243 		timevalclear(&p->p_realtimer.it_interval);
244 		msleep(&p->p_itcallout, &p->p_mtx, PWAIT, "ritwait", 0);
245 		KASSERT(!timevalisset(&p->p_realtimer.it_value),
246 		    ("realtime timer is still armed"));
247 	}
248 	PROC_UNLOCK(p);
249 
250 	/*
251 	 * Reset any sigio structures pointing to us as a result of
252 	 * F_SETOWN with our pid.
253 	 */
254 	funsetownlst(&p->p_sigiolst);
255 
256 	/*
257 	 * If this process has an nlminfo data area (for lockd), release it
258 	 */
259 	if (nlminfo_release_p != NULL && p->p_nlminfo != NULL)
260 		(*nlminfo_release_p)(p);
261 
262 	/*
263 	 * Close open files and release open-file table.
264 	 * This may block!
265 	 */
266 	fdfree(td);
267 
268 	/*
269 	 * If this thread tickled GEOM, we need to wait for the giggling to
270 	 * stop before we return to userland
271 	 */
272 	if (td->td_pflags & TDP_GEOM)
273 		g_waitidle();
274 
275 	/*
276 	 * Remove ourself from our leader's peer list and wake our leader.
277 	 */
278 	mtx_lock(&ppeers_lock);
279 	if (p->p_leader->p_peers) {
280 		q = p->p_leader;
281 		while (q->p_peers != p)
282 			q = q->p_peers;
283 		q->p_peers = p->p_peers;
284 		wakeup(p->p_leader);
285 	}
286 	mtx_unlock(&ppeers_lock);
287 
288 	vmspace_exit(td);
289 
290 	mtx_lock(&Giant);	/* XXX TTY */
291 	sx_xlock(&proctree_lock);
292 	if (SESS_LEADER(p)) {
293 		struct session *sp;
294 
295 		sp = p->p_session;
296 		if (sp->s_ttyvp) {
297 			/*
298 			 * Controlling process.
299 			 * Signal foreground pgrp,
300 			 * drain controlling terminal
301 			 * and revoke access to controlling terminal.
302 			 */
303 			if (sp->s_ttyp && (sp->s_ttyp->t_session == sp)) {
304 				tp = sp->s_ttyp;
305 				if (sp->s_ttyp->t_pgrp) {
306 					PGRP_LOCK(sp->s_ttyp->t_pgrp);
307 					pgsignal(sp->s_ttyp->t_pgrp, SIGHUP, 1);
308 					PGRP_UNLOCK(sp->s_ttyp->t_pgrp);
309 				}
310 				/* XXX tp should be locked. */
311 				sx_xunlock(&proctree_lock);
312 				(void) ttywait(tp);
313 				sx_xlock(&proctree_lock);
314 				/*
315 				 * The tty could have been revoked
316 				 * if we blocked.
317 				 */
318 				if (sp->s_ttyvp) {
319 					ttyvp = sp->s_ttyvp;
320 					SESS_LOCK(p->p_session);
321 					sp->s_ttyvp = NULL;
322 					SESS_UNLOCK(p->p_session);
323 					sx_xunlock(&proctree_lock);
324 					VOP_LOCK(ttyvp, LK_EXCLUSIVE);
325 					VOP_REVOKE(ttyvp, REVOKEALL);
326 					vput(ttyvp);
327 					sx_xlock(&proctree_lock);
328 				}
329 			}
330 			if (sp->s_ttyvp) {
331 				ttyvp = sp->s_ttyvp;
332 				SESS_LOCK(p->p_session);
333 				sp->s_ttyvp = NULL;
334 				SESS_UNLOCK(p->p_session);
335 				vrele(ttyvp);
336 			}
337 			/*
338 			 * s_ttyp is not zero'd; we use this to indicate
339 			 * that the session once had a controlling terminal.
340 			 * (for logging and informational purposes)
341 			 */
342 		}
343 		SESS_LOCK(p->p_session);
344 		sp->s_leader = NULL;
345 		SESS_UNLOCK(p->p_session);
346 	}
347 	fixjobc(p, p->p_pgrp, 0);
348 	sx_xunlock(&proctree_lock);
349 	(void)acct_process(td);
350 	mtx_unlock(&Giant);
351 #ifdef KTRACE
352 	/*
353 	 * Disable tracing, then drain any pending records and release
354 	 * the trace file.
355 	 */
356 	if (p->p_traceflag != 0) {
357 		PROC_LOCK(p);
358 		mtx_lock(&ktrace_mtx);
359 		p->p_traceflag = 0;
360 		mtx_unlock(&ktrace_mtx);
361 		PROC_UNLOCK(p);
362 		ktrprocexit(td);
363 		PROC_LOCK(p);
364 		mtx_lock(&ktrace_mtx);
365 		tracevp = p->p_tracevp;
366 		p->p_tracevp = NULL;
367 		tracecred = p->p_tracecred;
368 		p->p_tracecred = NULL;
369 		mtx_unlock(&ktrace_mtx);
370 		PROC_UNLOCK(p);
371 		if (tracevp != NULL) {
372 			locked = VFS_LOCK_GIANT(tracevp->v_mount);
373 			vrele(tracevp);
374 			VFS_UNLOCK_GIANT(locked);
375 		}
376 		if (tracecred != NULL)
377 			crfree(tracecred);
378 	}
379 #endif
380 	/*
381 	 * Release reference to text vnode
382 	 */
383 	if ((vtmp = p->p_textvp) != NULL) {
384 		p->p_textvp = NULL;
385 		locked = VFS_LOCK_GIANT(vtmp->v_mount);
386 		vrele(vtmp);
387 		VFS_UNLOCK_GIANT(locked);
388 	}
389 
390 	/*
391 	 * Release our limits structure.
392 	 */
393 	PROC_LOCK(p);
394 	plim = p->p_limit;
395 	p->p_limit = NULL;
396 	PROC_UNLOCK(p);
397 	lim_free(plim);
398 
399 	/*
400 	 * Remove proc from allproc queue and pidhash chain.
401 	 * Place onto zombproc.  Unlink from parent's child list.
402 	 */
403 	sx_xlock(&allproc_lock);
404 	LIST_REMOVE(p, p_list);
405 	LIST_INSERT_HEAD(&zombproc, p, p_list);
406 	LIST_REMOVE(p, p_hash);
407 	sx_xunlock(&allproc_lock);
408 
409 	/*
410 	 * Call machine-dependent code to release any
411 	 * machine-dependent resources other than the address space.
412 	 * The address space is released by "vmspace_exitfree(p)" in
413 	 * vm_waitproc().
414 	 */
415 	cpu_exit(td);
416 
417 	WITNESS_WARN(WARN_PANIC, NULL, "process (pid %d) exiting", p->p_pid);
418 
419 	/*
420 	 * Reparent all of our children to init.
421 	 */
422 	sx_xlock(&proctree_lock);
423 	q = LIST_FIRST(&p->p_children);
424 	if (q != NULL)		/* only need this if any child is S_ZOMB */
425 		wakeup(initproc);
426 	for (; q != NULL; q = nq) {
427 		nq = LIST_NEXT(q, p_sibling);
428 		PROC_LOCK(q);
429 		proc_reparent(q, initproc);
430 		q->p_sigparent = SIGCHLD;
431 		/*
432 		 * Traced processes are killed
433 		 * since their existence means someone is screwing up.
434 		 */
435 		if (q->p_flag & P_TRACED) {
436 			q->p_flag &= ~(P_TRACED | P_STOPPED_TRACE);
437 			psignal(q, SIGKILL);
438 		}
439 		PROC_UNLOCK(q);
440 	}
441 
442 	/* Save exit status. */
443 	PROC_LOCK(p);
444 	p->p_xstat = rv;
445 	p->p_xthread = td;
446 	/*
447 	 * Notify interested parties of our demise.
448 	 */
449 	KNOTE_LOCKED(&p->p_klist, NOTE_EXIT);
450 
451 	/*
452 	 * Just delete all entries in the p_klist. At this point we won't
453 	 * report any more events, and there are nasty race conditions that
454 	 * can beat us if we don't.
455 	 */
456 	knlist_clear(&p->p_klist, 1);
457 
458 	/*
459 	 * Notify parent that we're gone.  If parent has the PS_NOCLDWAIT
460 	 * flag set, or if the handler is set to SIG_IGN, notify process
461 	 * 1 instead (and hope it will handle this situation).
462 	 */
463 	PROC_LOCK(p->p_pptr);
464 	mtx_lock(&p->p_pptr->p_sigacts->ps_mtx);
465 	if (p->p_pptr->p_sigacts->ps_flag & (PS_NOCLDWAIT | PS_CLDSIGIGN)) {
466 		struct proc *pp;
467 
468 		mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx);
469 		pp = p->p_pptr;
470 		PROC_UNLOCK(pp);
471 		proc_reparent(p, initproc);
472 		p->p_sigparent = SIGCHLD;
473 		PROC_LOCK(p->p_pptr);
474 		/*
475 		 * If this was the last child of our parent, notify
476 		 * parent, so in case he was wait(2)ing, he will
477 		 * continue.
478 		 */
479 		if (LIST_EMPTY(&pp->p_children))
480 			wakeup(pp);
481 	} else
482 		mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx);
483 
484 	if (p->p_pptr == initproc)
485 		psignal(p->p_pptr, SIGCHLD);
486 	else if (p->p_sigparent != 0) {
487 		if (p->p_sigparent == SIGCHLD)
488 			childproc_exited(p);
489 		else	/* LINUX thread */
490 			psignal(p->p_pptr, p->p_sigparent);
491 	}
492 	sx_xunlock(&proctree_lock);
493 
494 	/*
495 	 * The state PRS_ZOMBIE prevents other proesses from sending
496 	 * signal to the process, to avoid memory leak, we free memory
497 	 * for signal queue at the time when the state is set.
498 	 */
499 	sigqueue_flush(&p->p_sigqueue);
500 	sigqueue_flush(&td->td_sigqueue);
501 
502 	/*
503 	 * We have to wait until after acquiring all locks before
504 	 * changing p_state.  We need to avoid all possible context
505 	 * switches (including ones from blocking on a mutex) while
506 	 * marked as a zombie.  We also have to set the zombie state
507 	 * before we release the parent process' proc lock to avoid
508 	 * a lost wakeup.  So, we first call wakeup, then we grab the
509 	 * sched lock, update the state, and release the parent process'
510 	 * proc lock.
511 	 */
512 	wakeup(p->p_pptr);
513 	sched_exit(p->p_pptr, td);
514 	PROC_SLOCK(p);
515 	p->p_state = PRS_ZOMBIE;
516 	PROC_UNLOCK(p->p_pptr);
517 
518 	/*
519 	 * Hopefully no one will try to deliver a signal to the process this
520 	 * late in the game.
521 	 */
522 	knlist_destroy(&p->p_klist);
523 
524 	/*
525 	 * Save our children's rusage information in our exit rusage.
526 	 */
527 	ruadd(&p->p_ru, &p->p_rux, &p->p_stats->p_cru, &p->p_crux);
528 
529 	/*
530 	 * Make sure the scheduler takes this thread out of its tables etc.
531 	 * This will also release this thread's reference to the ucred.
532 	 * Other thread parts to release include pcb bits and such.
533 	 */
534 	thread_exit();
535 }
536 
537 
538 #ifndef _SYS_SYSPROTO_H_
539 struct abort2_args {
540 	char *why;
541 	int nargs;
542 	void **args;
543 };
544 #endif
545 
546 int
547 abort2(struct thread *td, struct abort2_args *uap)
548 {
549 	struct proc *p = td->td_proc;
550 	struct sbuf *sb;
551 	void *uargs[16];
552 	int error, i, sig;
553 
554 	error = 0;	/* satisfy compiler */
555 
556 	/*
557 	 * Do it right now so we can log either proper call of abort2(), or
558 	 * note, that invalid argument was passed. 512 is big enough to
559 	 * handle 16 arguments' descriptions with additional comments.
560 	 */
561 	sb = sbuf_new(NULL, NULL, 512, SBUF_FIXEDLEN);
562 	sbuf_clear(sb);
563 	sbuf_printf(sb, "%s(pid %d uid %d) aborted: ",
564 	    p->p_comm, p->p_pid, td->td_ucred->cr_uid);
565 	/*
566 	 * Since we can't return from abort2(), send SIGKILL in cases, where
567 	 * abort2() was called improperly
568 	 */
569 	sig = SIGKILL;
570 	/* Prevent from DoSes from user-space. */
571 	if (uap->nargs < 0 || uap->nargs > 16)
572 		goto out;
573 	if (uap->nargs > 0) {
574 		if (uap->args == NULL)
575 			goto out;
576 		error = copyin(uap->args, uargs, uap->nargs * sizeof(void *));
577 		if (error != 0)
578 			goto out;
579 	}
580 	/*
581 	 * Limit size of 'reason' string to 128. Will fit even when
582 	 * maximal number of arguments was chosen to be logged.
583 	 */
584 	if (uap->why != NULL) {
585 		error = sbuf_copyin(sb, uap->why, 128);
586 		if (error < 0)
587 			goto out;
588 	} else {
589 		sbuf_printf(sb, "(null)");
590 	}
591 	if (uap->nargs > 0) {
592 		sbuf_printf(sb, "(");
593 		for (i = 0;i < uap->nargs; i++)
594 			sbuf_printf(sb, "%s%p", i == 0 ? "" : ", ", uargs[i]);
595 		sbuf_printf(sb, ")");
596 	}
597 	/*
598 	 * Final stage: arguments were proper, string has been
599 	 * successfully copied from userspace, and copying pointers
600 	 * from user-space succeed.
601 	 */
602 	sig = SIGABRT;
603 out:
604 	if (sig == SIGKILL) {
605 		sbuf_trim(sb);
606 		sbuf_printf(sb, " (Reason text inaccessible)");
607 	}
608 	sbuf_cat(sb, "\n");
609 	sbuf_finish(sb);
610 	log(LOG_INFO, "%s", sbuf_data(sb));
611 	sbuf_delete(sb);
612 	exit1(td, W_EXITCODE(0, sig));
613 	return (0);
614 }
615 
616 
617 #ifdef COMPAT_43
618 /*
619  * The dirty work is handled by kern_wait().
620  */
621 int
622 owait(struct thread *td, struct owait_args *uap __unused)
623 {
624 	int error, status;
625 
626 	error = kern_wait(td, WAIT_ANY, &status, 0, NULL);
627 	if (error == 0)
628 		td->td_retval[1] = status;
629 	return (error);
630 }
631 #endif /* COMPAT_43 */
632 
633 /*
634  * The dirty work is handled by kern_wait().
635  */
636 int
637 wait4(struct thread *td, struct wait_args *uap)
638 {
639 	struct rusage ru, *rup;
640 	int error, status;
641 
642 	if (uap->rusage != NULL)
643 		rup = &ru;
644 	else
645 		rup = NULL;
646 	error = kern_wait(td, uap->pid, &status, uap->options, rup);
647 	if (uap->status != NULL && error == 0)
648 		error = copyout(&status, uap->status, sizeof(status));
649 	if (uap->rusage != NULL && error == 0)
650 		error = copyout(&ru, uap->rusage, sizeof(struct rusage));
651 	return (error);
652 }
653 
654 int
655 kern_wait(struct thread *td, pid_t pid, int *status, int options,
656     struct rusage *rusage)
657 {
658 	struct proc *p, *q, *t;
659 	int error, nfound;
660 
661 	AUDIT_ARG(pid, pid);
662 
663 	q = td->td_proc;
664 	if (pid == 0) {
665 		PROC_LOCK(q);
666 		pid = -q->p_pgid;
667 		PROC_UNLOCK(q);
668 	}
669 	if (options &~ (WUNTRACED|WNOHANG|WCONTINUED|WLINUXCLONE))
670 		return (EINVAL);
671 loop:
672 	if (q->p_flag & P_STATCHILD) {
673 		PROC_LOCK(q);
674 		q->p_flag &= ~P_STATCHILD;
675 		PROC_UNLOCK(q);
676 	}
677 	nfound = 0;
678 	sx_xlock(&proctree_lock);
679 	LIST_FOREACH(p, &q->p_children, p_sibling) {
680 		PROC_LOCK(p);
681 		if (pid != WAIT_ANY &&
682 		    p->p_pid != pid && p->p_pgid != -pid) {
683 			PROC_UNLOCK(p);
684 			continue;
685 		}
686 		if (p_canwait(td, p)) {
687 			PROC_UNLOCK(p);
688 			continue;
689 		}
690 
691 		/*
692 		 * This special case handles a kthread spawned by linux_clone
693 		 * (see linux_misc.c).  The linux_wait4 and linux_waitpid
694 		 * functions need to be able to distinguish between waiting
695 		 * on a process and waiting on a thread.  It is a thread if
696 		 * p_sigparent is not SIGCHLD, and the WLINUXCLONE option
697 		 * signifies we want to wait for threads and not processes.
698 		 */
699 		if ((p->p_sigparent != SIGCHLD) ^
700 		    ((options & WLINUXCLONE) != 0)) {
701 			PROC_UNLOCK(p);
702 			continue;
703 		}
704 
705 		nfound++;
706 		PROC_SLOCK(p);
707 		if (p->p_state == PRS_ZOMBIE) {
708 			if (rusage) {
709 				*rusage = p->p_ru;
710 				calcru(p, &rusage->ru_utime, &rusage->ru_stime);
711 			}
712 			PROC_SUNLOCK(p);
713 			td->td_retval[0] = p->p_pid;
714 			if (status)
715 				*status = p->p_xstat;	/* convert to int */
716 			PROC_LOCK(q);
717 			sigqueue_take(p->p_ksi);
718 			PROC_UNLOCK(q);
719 
720 			/*
721 			 * If we got the child via a ptrace 'attach',
722 			 * we need to give it back to the old parent.
723 			 */
724 			PROC_UNLOCK(p);
725 			if (p->p_oppid && (t = pfind(p->p_oppid)) != NULL) {
726 				PROC_LOCK(p);
727 				p->p_oppid = 0;
728 				proc_reparent(p, t);
729 				PROC_UNLOCK(p);
730 				tdsignal(t, NULL, SIGCHLD, p->p_ksi);
731 				wakeup(t);
732 				PROC_UNLOCK(t);
733 				sx_xunlock(&proctree_lock);
734 				return (0);
735 			}
736 
737 			/*
738 			 * Remove other references to this process to ensure
739 			 * we have an exclusive reference.
740 			 */
741 			sx_xlock(&allproc_lock);
742 			LIST_REMOVE(p, p_list);	/* off zombproc */
743 			sx_xunlock(&allproc_lock);
744 			LIST_REMOVE(p, p_sibling);
745 			leavepgrp(p);
746 			sx_xunlock(&proctree_lock);
747 
748 			/*
749 			 * As a side effect of this lock, we know that
750 			 * all other writes to this proc are visible now, so
751 			 * no more locking is needed for p.
752 			 */
753 			PROC_LOCK(p);
754 			p->p_xstat = 0;		/* XXX: why? */
755 			PROC_UNLOCK(p);
756 			PROC_LOCK(q);
757 			ruadd(&q->p_stats->p_cru, &q->p_crux, &p->p_ru,
758 			    &p->p_rux);
759 			PROC_UNLOCK(q);
760 
761 			/*
762 			 * Decrement the count of procs running with this uid.
763 			 */
764 			(void)chgproccnt(p->p_ucred->cr_ruidinfo, -1, 0);
765 
766 			/*
767 			 * Free credentials, arguments, and sigacts.
768 			 */
769 			crfree(p->p_ucred);
770 			p->p_ucred = NULL;
771 			pargs_drop(p->p_args);
772 			p->p_args = NULL;
773 			sigacts_free(p->p_sigacts);
774 			p->p_sigacts = NULL;
775 
776 			/*
777 			 * Do any thread-system specific cleanups.
778 			 */
779 			thread_wait(p);
780 
781 			/*
782 			 * Give vm and machine-dependent layer a chance
783 			 * to free anything that cpu_exit couldn't
784 			 * release while still running in process context.
785 			 */
786 			vm_waitproc(p);
787 #ifdef MAC
788 			mac_proc_destroy(p);
789 #endif
790 			KASSERT(FIRST_THREAD_IN_PROC(p),
791 			    ("kern_wait: no residual thread!"));
792 			uma_zfree(proc_zone, p);
793 			sx_xlock(&allproc_lock);
794 			nprocs--;
795 			sx_xunlock(&allproc_lock);
796 			return (0);
797 		}
798 		if ((p->p_flag & P_STOPPED_SIG) &&
799 		    (p->p_suspcount == p->p_numthreads) &&
800 		    (p->p_flag & P_WAITED) == 0 &&
801 		    (p->p_flag & P_TRACED || options & WUNTRACED)) {
802 			PROC_SUNLOCK(p);
803 			p->p_flag |= P_WAITED;
804 			sx_xunlock(&proctree_lock);
805 			td->td_retval[0] = p->p_pid;
806 			if (status)
807 				*status = W_STOPCODE(p->p_xstat);
808 
809 			PROC_LOCK(q);
810 			sigqueue_take(p->p_ksi);
811 			PROC_UNLOCK(q);
812 			PROC_UNLOCK(p);
813 
814 			return (0);
815 		}
816 		PROC_SUNLOCK(p);
817 		if (options & WCONTINUED && (p->p_flag & P_CONTINUED)) {
818 			sx_xunlock(&proctree_lock);
819 			td->td_retval[0] = p->p_pid;
820 			p->p_flag &= ~P_CONTINUED;
821 
822 			PROC_LOCK(q);
823 			sigqueue_take(p->p_ksi);
824 			PROC_UNLOCK(q);
825 			PROC_UNLOCK(p);
826 
827 			if (status)
828 				*status = SIGCONT;
829 			return (0);
830 		}
831 		PROC_UNLOCK(p);
832 	}
833 	if (nfound == 0) {
834 		sx_xunlock(&proctree_lock);
835 		return (ECHILD);
836 	}
837 	if (options & WNOHANG) {
838 		sx_xunlock(&proctree_lock);
839 		td->td_retval[0] = 0;
840 		return (0);
841 	}
842 	PROC_LOCK(q);
843 	sx_xunlock(&proctree_lock);
844 	if (q->p_flag & P_STATCHILD) {
845 		q->p_flag &= ~P_STATCHILD;
846 		error = 0;
847 	} else
848 		error = msleep(q, &q->p_mtx, PWAIT | PCATCH, "wait", 0);
849 	PROC_UNLOCK(q);
850 	if (error)
851 		return (error);
852 	goto loop;
853 }
854 
855 /*
856  * Make process 'parent' the new parent of process 'child'.
857  * Must be called with an exclusive hold of proctree lock.
858  */
859 void
860 proc_reparent(struct proc *child, struct proc *parent)
861 {
862 
863 	sx_assert(&proctree_lock, SX_XLOCKED);
864 	PROC_LOCK_ASSERT(child, MA_OWNED);
865 	if (child->p_pptr == parent)
866 		return;
867 
868 	PROC_LOCK(child->p_pptr);
869 	sigqueue_take(child->p_ksi);
870 	PROC_UNLOCK(child->p_pptr);
871 	LIST_REMOVE(child, p_sibling);
872 	LIST_INSERT_HEAD(&parent->p_children, child, p_sibling);
873 	child->p_pptr = parent;
874 }
875