[alsa-devel] Setting invalid samplerate

Clemens Ladisch clemens at ladisch.de
Thu May 19 12:55:28 CEST 2011


Torsten Schenk wrote:
> I'm working on the driver for the dmx 6fire usb.  ... 
> since Ubuntu 11.04, I get complaints about the card not working anymore,

I'd guess that would be commit 82d90313980b:
| ALSA: USB: 6fire: signedness bug in usb6fire_pcm_prepare()
| 
| rt->rate is an unsigned char so it's never equal to -1.  It's not a huge
| problem because the invalid rate is caught inside the call to
| usb6fire_pcm_set_rate() which returns -EINVAL.  But if we fix the test
| then it prints out the correct error message so that's good.
| 
| Signed-off-by: Dan Carpenter <error27 at gmail.com>
| 
| --- a/sound/usb/6fire/pcm.c
| +++ b/sound/usb/6fire/pcm.c
| @@ -493,13 +493,12 @@ static int usb6fire_pcm_prepare(struct snd_pcm_substream *alsa_sub)
|  	sub->period_off = 0;
|  
|  	if (rt->stream_state == STREAM_DISABLED) {
| -		rt->rate = -1;
|  		for (i = 0; i < ARRAY_SIZE(rates); i++)
|  			if (alsa_rt->rate == rates[i]) {
|  				rt->rate = i;
|  				break;
|  			}
| -		if (rt->rate == -1) {
| +		if (i == ARRAY_SIZE(rates)) {
|  			mutex_unlock(&rt->stream_mutex);
|  			snd_printk("invalid rate %d in prepare.\n",
|  					alsa_rt->rate);

This fixed not a bug but just a symptom of the actual bug, that rt->rate
is not signed.

There are still "rt->rate = -1" initializations, and usb6fire_pcm_open()
then does:

	if (rt->rate >= 0)
		alsa_rt->hw.rates = rates_alsaid[rt->rate];


Regards,
Clemens


More information about the Alsa-devel mailing list