diff options
author | alfred <alfred@FreeBSD.org> | 2002-04-04 00:52:03 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2002-04-04 00:52:03 +0000 |
commit | 6dc270c501d56ffc60526f2af97d76db09f274ff (patch) | |
tree | 1710309d06c3aa019e844bfdd27ffe39a33b78e3 /sys/kern/subr_eventhandler.c | |
parent | 05b07d79e330ed63c030ec9f64c5883dd666c9c2 (diff) | |
download | FreeBSD-src-6dc270c501d56ffc60526f2af97d76db09f274ff.zip FreeBSD-src-6dc270c501d56ffc60526f2af97d76db09f274ff.tar.gz |
Avoid a lock order reversal by dropping the eventhandler_mutex earlier.
We get enough protection from the lock on the individual lists that we
aquire later.
Noticed/Tested by: Steven G. Kargl <kargl@troutmask.apl.washington.edu>
Submitted by: Jonathan Mini <mini@haikugeek.com>
Diffstat (limited to 'sys/kern/subr_eventhandler.c')
-rw-r--r-- | sys/kern/subr_eventhandler.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/sys/kern/subr_eventhandler.c b/sys/kern/subr_eventhandler.c index 5cb2500..0a64ff1 100644 --- a/sys/kern/subr_eventhandler.c +++ b/sys/kern/subr_eventhandler.c @@ -101,11 +101,11 @@ eventhandler_register(struct eventhandler_list *list, char *name, sx_init(&list->el_lock, name); list->el_flags = EHE_INITTED; } + mtx_unlock(&eventhandler_mutex); /* allocate an entry for this handler, populate it */ if ((eg = malloc(sizeof(struct eventhandler_entry_generic), M_EVENTHANDLER, M_NOWAIT)) == NULL) { - mtx_unlock(&eventhandler_mutex); return(NULL); } eg->func = func; @@ -125,7 +125,6 @@ eventhandler_register(struct eventhandler_list *list, char *name, if (ep == NULL) TAILQ_INSERT_TAIL(&list->el_entries, &eg->ee, ee_link); EHE_UNLOCK(list); - mtx_unlock(&eventhandler_mutex); return(&eg->ee); } |