diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2017-11-11 18:04:39 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2017-11-11 18:04:39 +0000 |
commit | 6e1619dae3fc9083d1edf39e3835adc4acebb39c (patch) | |
tree | faa987765ff7185e8bff6ad1a1ccfae1999f9863 | |
parent | 272640b7fc579e5045eb4e6ad830bc89fbcae748 (diff) |
Notes
-rw-r--r-- | sys/kern/kern_event.c | 15 | ||||
-rw-r--r-- | sys/kern/kern_proc.c | 17 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 6 | ||||
-rw-r--r-- | sys/sys/proc.h | 1 |
4 files changed, 27 insertions, 12 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 7700e34f0372..69e501da278d 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -406,16 +406,15 @@ filt_procattach(struct knote *kn) bool exiting, immediate; exiting = immediate = false; - p = pfind(kn->kn_id); - if (p == NULL && (kn->kn_sfflags & NOTE_EXIT)) { - p = zpfind(kn->kn_id); - exiting = true; - } else if (p != NULL && (p->p_flag & P_WEXIT)) { - exiting = true; - } - + if (kn->kn_sfflags & NOTE_EXIT) + p = pfind_any(kn->kn_id); + else + p = pfind(kn->kn_id); if (p == NULL) return (ESRCH); + if (p->p_flag & P_WEXIT) + exiting = true; + if ((error = p_cansee(curthread, p))) { PROC_UNLOCK(p); return (error); diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index c6653d2e906b..fd998115946f 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -353,6 +353,23 @@ pfind(pid_t pid) return (p); } +/* + * Same as pfind but allow zombies. + */ +struct proc * +pfind_any(pid_t pid) +{ + struct proc *p; + + sx_slock(&allproc_lock); + p = pfind_locked(pid); + if (p == NULL) + p = zpfind_locked(pid); + sx_sunlock(&allproc_lock); + + return (p); +} + static struct proc * pfind_tid_locked(pid_t tid) { diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index ea3b68e370c6..92a2b50d21de 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1765,10 +1765,8 @@ sys_kill(struct thread *td, struct kill_args *uap) if (uap->pid > 0) { /* kill single process */ - if ((p = pfind(uap->pid)) == NULL) { - if ((p = zpfind(uap->pid)) == NULL) - return (ESRCH); - } + if ((p = pfind_any(uap->pid)) == NULL) + return (ESRCH); AUDIT_ARG_PROCESS(p); error = p_cansignal(td, p, uap->signum); if (error == 0 && uap->signum) diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 2daf1a6aee7d..7f455577f090 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -954,6 +954,7 @@ extern struct proc *initproc, *pageproc; /* Process slots for init, pager. */ extern struct uma_zone *proc_zone; struct proc *pfind(pid_t); /* Find process by id. */ +struct proc *pfind_any(pid_t); /* Find (zombie) process by id. */ struct proc *pfind_locked(pid_t pid); struct pgrp *pgfind(pid_t); /* Find process group by id. */ struct proc *zpfind(pid_t); /* Find zombie process by id. */ |