Module Name: src Committed By: christos Date: Sat Nov 24 15:14:32 UTC 2012
Modified Files: src/sys/kern: kern_event.c Log Message: - initialize kn_id - in close, invalidate f_data and f_type early to prevent accidental re-use - add a DIAGNOSTIC for when we use unsupported fd's and a KASSERT for f_event being NULL. To generate a diff of this commit: cvs rdiff -u -r1.78 -r1.79 src/sys/kern/kern_event.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_event.c diff -u src/sys/kern/kern_event.c:1.78 src/sys/kern/kern_event.c:1.79 --- src/sys/kern/kern_event.c:1.78 Sun Nov 18 13:36:01 2012 +++ src/sys/kern/kern_event.c Sat Nov 24 10:14:32 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_event.c,v 1.78 2012/11/18 18:36:01 pooka Exp $ */ +/* $NetBSD: kern_event.c,v 1.79 2012/11/24 15:14:32 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.78 2012/11/18 18:36:01 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.79 2012/11/24 15:14:32 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -972,6 +972,7 @@ kqueue_register(struct kqueue *kq, struc kn = newkn; newkn = NULL; kn->kn_obj = fp; + kn->kn_id = kev->ident; kn->kn_kq = kq; kn->kn_fop = kfilter->filtops; kn->kn_kfilter = kfilter; @@ -1013,6 +1014,10 @@ kqueue_register(struct kqueue *kq, struc error = (*kfilter->filtops->f_attach)(kn); KERNEL_UNLOCK_ONE(NULL); /* XXXSMP */ if (error != 0) { +#ifdef DIAGNOSTIC + printf("%s: event not supported for file type" + " %d\n", __func__, fp ? fp->f_type : -1); +#endif /* knote_detach() drops fdp->fd_lock */ knote_detach(kn, fdp, false); goto done; @@ -1028,6 +1033,13 @@ kqueue_register(struct kqueue *kq, struc kn->kn_sdata = kev->data; kn->kn_kevent.udata = kev->udata; } + /* + * We can get here if we are trying to attach + * an event to a file descriptor that does not + * support events, and the attach routine is + * broken and does not return an error. + */ + KASSERT(kn->kn_fop->f_event != NULL); KERNEL_LOCK(1, NULL); /* XXXSMP */ rv = (*kn->kn_fop->f_event)(kn, 0); KERNEL_UNLOCK_ONE(NULL); /* XXXSMP */ @@ -1432,6 +1444,8 @@ kqueue_close(file_t *fp) int i; kq = fp->f_data; + fp->f_data = NULL; + fp->f_type = 0; fdp = curlwp->l_fd; mutex_enter(&fdp->fd_lock); @@ -1452,7 +1466,6 @@ kqueue_close(file_t *fp) cv_destroy(&kq->kq_cv); seldestroy(&kq->kq_sel); kmem_free(kq, sizeof(*kq)); - fp->f_data = NULL; return (0); }