summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2002-10-01 14:06:53 +0000
committerart <art@openbsd.org>2002-10-01 14:06:53 +0000
commitf085e6239e866bec2b12d0f07311ec9ecec4dcc7 (patch)
treeea6b9646cbde31559d1b7e806ba9180f0ae73e37
parentboth of them; gwyllion@ace.ulyssis.org (diff)
downloadwireguard-openbsd-f085e6239e866bec2b12d0f07311ec9ecec4dcc7.tar.xz
wireguard-openbsd-f085e6239e866bec2b12d0f07311ec9ecec4dcc7.zip
Prevent two localhost crashes with proc filters.
- don't send NOTE_SIGNAL to exiting processes. - null dereference on error condition. from Peter Werner <peterw at ifost.org.au> deraadt@ ok
-rw-r--r--sys/kern/kern_event.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 2aba65c6e9b..6352c2e1256 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_event.c,v 1.17 2002/03/01 12:17:58 art Exp $ */
+/* $OpenBSD: kern_event.c,v 1.18 2002/10/01 14:06:53 art Exp $ */
/*-
* Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
@@ -77,7 +77,7 @@ struct fileops kqueueops = {
};
void knote_attach(struct knote *kn, struct filedesc *fdp);
-void knote_drop(struct knote *kn, struct proc *p);
+void knote_drop(struct knote *kn, struct proc *p, struct filedesc *fdp);
void knote_enqueue(struct knote *kn);
void knote_dequeue(struct knote *kn);
#define knote_alloc() ((struct knote *)pool_get(&knote_pool, PR_WAITOK))
@@ -481,7 +481,7 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct proc *p)
knote_attach(kn, fdp);
if ((error = fops->f_attach(kn)) != 0) {
- knote_drop(kn, p);
+ knote_drop(kn, p, fdp);
goto done;
}
} else {
@@ -502,7 +502,7 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct proc *p)
} else if (kev->flags & EV_DELETE) {
kn->kn_fop->f_detach(kn);
- knote_drop(kn, p);
+ knote_drop(kn, p, p->p_fd);
goto done;
}
@@ -622,7 +622,7 @@ start:
kq->kq_count--;
splx(s);
kn->kn_fop->f_detach(kn);
- knote_drop(kn, p);
+ knote_drop(kn, p, p->p_fd);
s = splhigh();
} else if (kn->kn_flags & EV_CLEAR) {
kn->kn_data = 0;
@@ -802,7 +802,7 @@ knote_remove(struct proc *p, struct klist *list)
while ((kn = SLIST_FIRST(list)) != NULL) {
kn->kn_fop->f_detach(kn);
- knote_drop(kn, p);
+ knote_drop(kn, p, p->p_fd);
}
}
@@ -858,9 +858,8 @@ done:
* while calling closef and free.
*/
void
-knote_drop(struct knote *kn, struct proc *p)
+knote_drop(struct knote *kn, struct proc *p, struct filedesc *fdp)
{
- struct filedesc *fdp = p->p_fd;
struct klist *list;
if (kn->kn_fop->f_isfd)