From a77fa3901d6cd2d19c4e01130aebda9cd584caac Mon Sep 17 00:00:00 2001 From: cg Date: Thu, 23 Aug 2001 12:21:12 +0000 Subject: 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 --- sys/dev/sound/pcm/dsp.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'sys/dev/sound') 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: -- cgit v1.1