summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2002-01-23 04:44:03 +0000
committercg <cg@FreeBSD.org>2002-01-23 04:44:03 +0000
commita9336f53544ccad50c9725c8f3c9e1113959a9cd (patch)
tree7da40118a6bd47bb278b48d53b117308706bdeb8
parentb75a033f7588a9c6ef9d7f21c864e9af9714de75 (diff)
downloadFreeBSD-src-a9336f53544ccad50c9725c8f3c9e1113959a9cd.zip
FreeBSD-src-a9336f53544ccad50c9725c8f3c9e1113959a9cd.tar.gz
add more error checking to open of /dev/dsp* and /dev/audio* - if the
default format for the chosen subdevice cannot be obtained return an error instead of returning success with an indeteterminate format selected. note that this should never happen once the feederchain builder works for recording.
-rw-r--r--sys/dev/sound/pcm/dsp.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 55147e3..2f1462c 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -285,7 +285,15 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td)
/* bump refcounts, reset and unlock any channels that we just opened */
if (rdch) {
if (flags & FREAD) {
- chn_reset(rdch, fmt);
+ if (chn_reset(rdch, fmt)) {
+ pcm_lock(d);
+ pcm_chnrelease(rdch);
+ if (wrch && (flags & FWRITE))
+ pcm_chnrelease(wrch);
+ pcm_unlock(d);
+ splx(s);
+ return ENODEV;
+ }
if (flags & O_NONBLOCK)
rdch->flags |= CHN_F_NBIO;
} else
@@ -296,7 +304,15 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td)
}
if (wrch) {
if (flags & FWRITE) {
- chn_reset(wrch, fmt);
+ if (chn_reset(wrch, fmt)) {
+ pcm_lock(d);
+ pcm_chnrelease(wrch);
+ if (rdch && (flags & FREAD))
+ pcm_chnrelease(rdch);
+ pcm_unlock(d);
+ splx(s);
+ return ENODEV;
+ }
if (flags & O_NONBLOCK)
wrch->flags |= CHN_F_NBIO;
} else
OpenPOWER on IntegriCloud