summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-08-23 12:21:12 +0000
committercg <cg@FreeBSD.org>2001-08-23 12:21:12 +0000
commita77fa3901d6cd2d19c4e01130aebda9cd584caac (patch)
tree56ce2860688079e7e409d683ac60f986feb13c48 /sys/dev/sound
parentf92a958097d6b828f459190ac1dcb37f683caf7b (diff)
downloadFreeBSD-src-a77fa3901d6cd2d19c4e01130aebda9cd584caac.zip
FreeBSD-src-a77fa3901d6cd2d19c4e01130aebda9cd584caac.tar.gz
handle bogus values passed to SOUND_PCM_WRITE_CHANNELS/SNDCTL_DSP_CHANNELS
ioctls better- if 0 is passed, return the current setting. if 1 or 2 are passed, behave accordingly. treat values >2 as 2. PR: kern/29964
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pcm/dsp.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index cfc3067..d7b2f21 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -700,9 +700,9 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
case SOUND_PCM_WRITE_CHANNELS:
/* case SNDCTL_DSP_CHANNELS: ( == SOUND_PCM_WRITE_CHANNELS) */
- if (*arg_i == 1 || *arg_i == 2) {
+ if (*arg_i != 0) {
tmp = 0;
- *arg_i = (*arg_i == 2)? AFMT_STEREO : 0;
+ *arg_i = (*arg_i != 1)? AFMT_STEREO : 0;
if (wrch) {
CHN_LOCK(wrch);
ret = chn_setformat(wrch, (wrch->format & ~AFMT_STEREO) | *arg_i);
@@ -717,8 +717,9 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
CHN_UNLOCK(rdch);
}
*arg_i = tmp;
- } else
- *arg_i = 0;
+ } else {
+ *arg_i = ((wrch? wrch->format : rdch->format) & AFMT_STEREO)? 2 : 1;
+ }
break;
case SOUND_PCM_READ_CHANNELS:
OpenPOWER on IntegriCloud