summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-04-02 21:54:51 +0000
committerjhb <jhb@FreeBSD.org>2003-04-02 21:54:51 +0000
commitc0b4f0941651216866b58fd606374f0c651fa082 (patch)
tree192d39aebb14c6c94b48ca15c4496b9f8ebb845d /sys
parent39cbb43bab476ff3c79356e36f26e51a6b90a692 (diff)
downloadFreeBSD-src-c0b4f0941651216866b58fd606374f0c651fa082.zip
FreeBSD-src-c0b4f0941651216866b58fd606374f0c651fa082.tar.gz
Lock the process before sending it a SIGIO. Not doing so is a panic(2)
implementation with INVARIANTS.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/subr_bus.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index b6e8d21..6c59558 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -383,6 +383,7 @@ static void
devaddq(const char *type, const char *what, device_t dev)
{
struct dev_event_info *n1 = NULL;
+ struct proc *p;
char *data = NULL;
char *loc;
const char *parstr;
@@ -412,8 +413,12 @@ devaddq(const char *type, const char *what, device_t dev)
cv_broadcast(&devsoftc.cv);
mtx_unlock(&devsoftc.mtx);
selwakeup(&devsoftc.sel);
- if (devsoftc.async_proc)
- psignal(devsoftc.async_proc, SIGIO);
+ p = devsoftc.async_proc;
+ if (p != NULL) {
+ PROC_LOCK(p);
+ psignal(p, SIGIO);
+ PROC_UNLOCK(p);
+ }
return;
bad:;
free(data, M_BUS);
OpenPOWER on IntegriCloud