⬢ DragonFlyBSD Kernel Audit
DF-4285 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/sound/midi/midi.c
+++ b/sys/dev/sound/midi/midi.c
@@ -368,14 +368,17 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
 err2:
+	lockmgr(&m->qlock, LK_RELEASE);
+	lockmgr(&m->lock, LK_RELEASE);	/* err2 is reached with both held */
 	lockuninit(&m->qlock);
 	lockuninit(&m->lock);
 
 	if (MIDIQ_BUF(m->inq))
 		kfree(MIDIQ_BUF(m->inq), M_MIDI);
 	if (MIDIQ_BUF(m->outq))
 		kfree(MIDIQ_BUF(m->outq), M_MIDI);
 err1:
+	kfree(m->synth, M_MIDI);	/* allocated at midi_init:311 */
 	kfree(m, M_MIDI);
 err0:
 	lockmgr(&midistat_lock, LK_RELEASE);