[alsa-devel] old bug in au88x0_core.c

Takashi Iwai tiwai at suse.de
Wed Jun 29 15:40:39 CEST 2016


On Mon, 27 Jun 2016 15:03:47 +0200,
Dan Carpenter wrote:
> 
> Hi ALSA devs,
> 
> The patch 1da177e4c3f4: "Linux-2.6.12-rc2" from Apr 16, 2005, leads
> to the following static checker warning:
> 
> 	sound/pci/au88x0/au88x0_core.c:1449 vortex_wtdma_bufshift()
> 	warn: mask and shift to zero
> 
> sound/pci/au88x0/au88x0_core.c
>   1441  static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
>   1442  {
>   1443          stream_t *dma = &vortex->dma_wt[wtdma];
>   1444          int page, p, pp, delta, i;
>   1445  
>   1446          page =
>   1447              (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) &
>   1448               WT_SUBBUF_MASK)
>   1449              >> WT_SUBBUF_SHIFT;
> 
> This is always zero because:
> 
> #define WT_SUBBUF_MASK 0x3
> #define WT_SUBBUF_SHIFT 0x15
> 
>   1450          if (dma->nr_periods >= 4)
>   1451                  delta = (page - dma->period_real) & 3;
>   1452          else {
>   1453                  delta = (page - dma->period_real);
>   1454                  if (delta < 0)
>   1455                          delta += dma->nr_periods;
>   1456          }
>   1457          if (delta == 0)
>   1458                  return 0;
> 
> 
>   1493  #if 0
>   1494  static void
>   1495  vortex_wtdma_getposition(vortex_t * vortex, int wtdma, int *subbuf, int *pos)
>   1496  {
>   1497          int temp;
>   1498          temp = hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2));
>   1499          *subbuf = (temp >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK;
> 
> >From this ifdef zero code, it looks like we should shift first then do
> the mask.
> 
>   1500          *pos = temp & POS_MASK;
>   1501  }
>   1502  
>   1503  static int vortex_wtdma_getcursubuffer(vortex_t * vortex, int wtdma)
>   1504  {
>   1505          return ((hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) >>
>   1506                   POS_SHIFT) & POS_MASK);
>   1507  }
>   1508  #endif

Correct, this should be fixed in that way.  Below is the fix patch I'm
going to queue.


thanks,

Takashi

-- 8< --
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ALSA: au88x0: Fix calculation in vortex_wtdma_bufshift()

vortex_wtdma_bufshift() function does calculate the page index
wrongly, first masking then shift, which always results in zero.
The proper computation is to first shift, then mask.

Reported-by: Dan Carpenter <dan.carpenter at oracle.com>
Cc: <stable at vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 sound/pci/au88x0/au88x0_core.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/sound/pci/au88x0/au88x0_core.c b/sound/pci/au88x0/au88x0_core.c
index 4a054d720112..d3125c169684 100644
--- a/sound/pci/au88x0/au88x0_core.c
+++ b/sound/pci/au88x0/au88x0_core.c
@@ -1444,9 +1444,8 @@ static int vortex_wtdma_bufshift(vortex_t * vortex, int wtdma)
 	int page, p, pp, delta, i;
 
 	page =
-	    (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)) &
-	     WT_SUBBUF_MASK)
-	    >> WT_SUBBUF_SHIFT;
+	    (hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2))
+	     >> WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK;
 	if (dma->nr_periods >= 4)
 		delta = (page - dma->period_real) & 3;
 	else {
-- 
2.9.0



More information about the Alsa-devel mailing list