From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Thibault Date: Sun, 30 Jun 2002 21:49:19 +0000 Subject: [PATCH] 2.4.18 linux/drivers/maestro.c dev_audio flaw Message-Id: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-sound@vger.kernel.org Hi ! It seems that the value of ess->dev_audio is wrongly interpreted. Here's its only initialization : (maestro.c:3473) if ((s->dev_audio = register_sound_dsp(&ess_audio_fops, -1)) < 0) register_sound_dsp can return -ENOMEM for instance, so checking whether < 0 is mandatory. However, in (almost) the rest of the file, only = -1 is tested, so here's a patch. Furthermore, printing some error message may sometimes be handy, such as when -ENOENT is returned (no hole was found for the driver), just to understand why the device was probed, but isn't actually accessible. Best regards, Samuel Thibault diff -urN linux-2.4.18-cor/drivers/sound/maestro.c linux-2.4.18-cor2/drivers/sound/maestro.c --- linux-2.4.18-cor/drivers/sound/maestro.c Sun Jun 30 22:02:11 2002 +++ linux-2.4.18-cor2/drivers/sound/maestro.c Sun Jun 30 23:34:26 2002 @@ -1963,7 +1963,7 @@ for(i=0;ichannels[i]; - if(s->dev_audio = -1) + if(s->dev_audio < 0) break; spin_lock(&s->lock); ess_update_ptr(s); @@ -2917,7 +2917,7 @@ for(i=0;icard->channels[i]; - if(ess->dev_audio = -1) + if(ess->dev_audio < 0) continue; ess->dma_dac.ready = s->dma_dac.mapped = 0; @@ -3480,7 +3480,7 @@ for(;ichannels[i]; - s->dev_audio = -1; + s->dev_audio = -ENODEV; } ess = &card->channels[0]; @@ -3541,7 +3541,7 @@ for(i=0;ichannels[i]; - if(s->dev_audio != -1) + if(s->dev_audio >= 0) unregister_sound_dsp(s->dev_audio); } release_region(card->iobase, 256); @@ -3586,7 +3586,7 @@ for(i=0;ichannels[i]; - if(ess->dev_audio != -1) + if(ess->dev_audio >= 0) unregister_sound_dsp(ess->dev_audio); } /* Goodbye, Mr. Bond. */ @@ -3690,7 +3690,7 @@ for(i=0;ichannels[i]; - if(s->dev_audio = -1) + if(s->dev_audio < 0) continue; M_printk("maestro: stopping apus for device %d\n",i); @@ -3743,7 +3743,7 @@ struct ess_state *s = &card->channels[i]; int chan,reg; - if(s->dev_audio = -1) + if(s->dev_audio < 0) continue; for(chan = 0 ; chan < 6 ; chan++) {