summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2017-11-11 18:04:39 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2017-11-11 18:04:39 +0000
commit6e1619dae3fc9083d1edf39e3835adc4acebb39c (patch)
treefaa987765ff7185e8bff6ad1a1ccfae1999f9863
parent272640b7fc579e5045eb4e6ad830bc89fbcae748 (diff)
Notes
-rw-r--r--sys/kern/kern_event.c15
-rw-r--r--sys/kern/kern_proc.c17
-rw-r--r--sys/kern/kern_sig.c6
-rw-r--r--sys/sys/proc.h1
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. */