[bug report] ALSA: hda: Interrupt servicing and BDL setup for compress streams

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Cezary Rojewski,

The patch 3e9582267e3a: "ALSA: hda: Interrupt servicing and BDL setup
for compress streams" from Dec 2, 2022, leads to the following Smatch
static checker warning:

	sound/hda/hdac_stream.c:544 snd_hdac_stream_setup_periods()
	error: uninitialized symbol 'dmab'.

sound/hda/hdac_stream.c
   487  int snd_hdac_stream_setup_periods(struct hdac_stream *azx_dev)
   488  {
   489          struct hdac_bus *bus = azx_dev->bus;
   490          struct snd_pcm_substream *substream = azx_dev->substream;
   491          struct snd_compr_stream *cstream = azx_dev->cstream;
   492          struct snd_pcm_runtime *runtime = NULL;
   493          struct snd_dma_buffer *dmab;
   494          __le32 *bdl;
   495          int i, ofs, periods, period_bytes;
   496          int pos_adj, pos_align;
   497  
   498          if (substream) {
   499                  runtime = substream->runtime;
   500                  dmab = snd_pcm_get_dma_buf(substream);
   501          } else if (cstream) {
   502                  dmab = snd_pcm_get_dma_buf(cstream);
   503          }

dmab is not initialized on else path.

   504  
   505          /* reset BDL address */
   506          snd_hdac_stream_writel(azx_dev, SD_BDLPL, 0);
   507          snd_hdac_stream_writel(azx_dev, SD_BDLPU, 0);
   508  
   509          period_bytes = azx_dev->period_bytes;
   510          periods = azx_dev->bufsize / period_bytes;
   511  
   512          /* program the initial BDL entries */
   513          bdl = (__le32 *)azx_dev->bdl.area;
   514          ofs = 0;
   515          azx_dev->frags = 0;
   516  
   517          pos_adj = bus->bdl_pos_adj;
   518          if (runtime && !azx_dev->no_period_wakeup && pos_adj > 0) {
   519                  pos_align = pos_adj;
   520                  pos_adj = DIV_ROUND_UP(pos_adj * runtime->rate, 48000);
   521                  if (!pos_adj)
   522                          pos_adj = pos_align;
   523                  else
   524                          pos_adj = roundup(pos_adj, pos_align);
   525                  pos_adj = frames_to_bytes(runtime, pos_adj);
   526                  if (pos_adj >= period_bytes) {
   527                          dev_warn(bus->dev, "Too big adjustment %d\n",
   528                                   pos_adj);
   529                          pos_adj = 0;
   530                  } else {
   531                          ofs = setup_bdle(bus, dmab, azx_dev,
   532                                           &bdl, ofs, pos_adj, true);

This is okay because runtime is set.

   533                          if (ofs < 0)
   534                                  goto error;
   535                  }
   536          } else
   537                  pos_adj = 0;
   538  
   539          for (i = 0; i < periods; i++) {
   540                  if (i == periods - 1 && pos_adj)
   541                          ofs = setup_bdle(bus, dmab, azx_dev,

This is okay because pos_adj is checked.

   542                                           &bdl, ofs, period_bytes - pos_adj, 0);
   543                  else
   544                          ofs = setup_bdle(bus, dmab, azx_dev,
                                                      ^^^^
Potentially uninitialized?

   545                                           &bdl, ofs, period_bytes,
   546                                           !azx_dev->no_period_wakeup);
   547                  if (ofs < 0)
   548                          goto error;
   549          }
   550          return 0;
   551  
   552   error:
   553          dev_err(bus->dev, "Too many BDL entries: buffer=%d, period=%d\n",
   554                  azx_dev->bufsize, period_bytes);
   555          return -EINVAL;
   556  }

regards,
dan carpenter



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux