[alsa-devel] ALSA: Add ALSA driver for Atmel Audio Bitstream DAC
Takashi Iwai
tiwai at suse.de
Fri Nov 29 13:58:12 CET 2013
At Fri, 29 Nov 2013 10:25:41 +0100,
Takashi Iwai wrote:
>
> At Wed, 27 Nov 2013 14:57:32 +0300,
> Dan Carpenter wrote:
> >
> > Hello Hans-Christian Egtvedt,
> >
> > The patch e4967d6016b7: "ALSA: Add ALSA driver for Atmel Audio
> > Bitstream DAC" from Feb 5, 2009, leads to the following
> > static checker warning: "sound/atmel/abdac.c:373 set_sample_rates()
> > error: buffer overflow 'dac->rates' 6 <= 6"
> >
> > sound/atmel/abdac.c
> > 354 /* we start at 192 kHz and work our way down to 5112 Hz */
> > 355 while (new_rate >= RATE_MIN && index < (MAX_NUM_RATES + 1)) {
> >
> > index == MAX_NUM_RATES + 1 so index is 7.
> >
> > 356 new_rate = clk_round_rate(dac->sample_clk, 256 * new_rate);
> > 357 if (new_rate < 0)
> > 358 break;
> > 359 /* make sure we are below the ABDAC clock */
> > 360 if (new_rate <= clk_get_rate(dac->pclk)) {
> > 361 dac->rates[index] = new_rate / 256;
> >
> > index == MAX_NUM_RATES is off by one.
> >
> > 362 index++;
> > 363 }
> > 364 /* divide by 256 and then by two to get next rate */
> > 365 new_rate /= 256 * 2;
> > 366 }
> > 367
> > 368 if (index) {
> > 369 int i;
> > 370
> > 371 /* reverse array, smallest go first */
> > 372 for (i = 0; i < (index / 2); i++) {
> > 373 unsigned int tmp = dac->rates[index - 1 - i];
> >
> > 7 - 1 - 0 is 6, but dac->rates[] only has 6 elements so we are
> > potentially reading beyond the end of the array here.
> >
> > 374 dac->rates[index - 1 - i] = dac->rates[i];
> > 375 dac->rates[i] = tmp;
> > 376 }
> > 377
> > 378 dac->constraints_rates.count = index;
> > 379 dac->constraints_rates.list = dac->rates;
> > 380 dac->constraints_rates.mask = 0;
> > 381 dac->rates_num = index;
> > 382
> > 383 retval = 0;
> > 384 }
>
> I guess the patch below should fix, but better to hear from
> Hans-Christian at first.
It seems that the post isn't reachable to him.
Then, I'm going to merge the fix later if no one objects.
Takashi
>
>
> thanks,
>
> Takashi
>
> ---
> diff --git a/sound/atmel/abdac.c b/sound/atmel/abdac.c
> index 872d59e35ee2..721d8fd45685 100644
> --- a/sound/atmel/abdac.c
> +++ b/sound/atmel/abdac.c
> @@ -357,7 +357,8 @@ static int set_sample_rates(struct atmel_abdac *dac)
> if (new_rate < 0)
> break;
> /* make sure we are below the ABDAC clock */
> - if (new_rate <= clk_get_rate(dac->pclk)) {
> + if (index < MAX_NUM_RATES &&
> + new_rate <= clk_get_rate(dac->pclk)) {
> dac->rates[index] = new_rate / 256;
> index++;
> }
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
More information about the Alsa-devel
mailing list