summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2007-01-27 15:55:59 +0000
committerariff <ariff@FreeBSD.org>2007-01-27 15:55:59 +0000
commit039ccd88f67885f8ecc000ebbbb0d3c4cb371964 (patch)
tree004fef42db3b6042554aa28b41aeaf59f6f43056 /sys/dev/sound
parent971f4351781dc72996a2e2fb0657fbb243c9b276 (diff)
downloadFreeBSD-src-039ccd88f67885f8ecc000ebbbb0d3c4cb371964.zip
FreeBSD-src-039ccd88f67885f8ecc000ebbbb0d3c4cb371964.tar.gz
Rearrange locking order to avoid LOR (cat /dev/midistat).
Reported by: rodrigc
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/midi/midi.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/dev/sound/midi/midi.c b/sys/dev/sound/midi/midi.c
index 36daf5f..3426a07 100644
--- a/sys/dev/sound/midi/midi.c
+++ b/sys/dev/sound/midi/midi.c
@@ -931,11 +931,15 @@ midistat_open(struct cdev *i_dev, int flags, int mode, struct thread * td)
return EBUSY;
}
midistat_isopen = 1;
+ mtx_unlock(&midistat_lock);
- if (sbuf_new(&midistat_sbuf, NULL, 4096, 0) == NULL) {
+ if (sbuf_new(&midistat_sbuf, NULL, 4096, SBUF_AUTOEXTEND) == NULL) {
error = ENXIO;
+ mtx_lock(&midistat_lock);
goto out;
}
+
+ mtx_lock(&midistat_lock);
midistat_bufptr = 0;
error = (midistat_prepare(&midistat_sbuf) > 0) ? 0 : ENOMEM;
@@ -974,9 +978,11 @@ midistat_read(struct cdev *i_dev, struct uio * buf, int flag)
}
l = min(buf->uio_resid, sbuf_len(&midistat_sbuf) - midistat_bufptr);
err = 0;
- if (l > 0)
+ if (l > 0) {
+ mtx_unlock(&midistat_lock);
err = uiomove(sbuf_data(&midistat_sbuf) + midistat_bufptr, l, buf);
- else
+ mtx_lock(&midistat_lock);
+ } else
l = 0;
midistat_bufptr += l;
mtx_unlock(&midistat_lock);
OpenPOWER on IntegriCloud