All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] ASoC: topology: Only free TLV for volume mixers of a widget
@ 2016-12-08 13:32 Dan Carpenter
  2016-12-08 20:47 ` Takashi Sakamoto
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2016-12-08 13:32 UTC (permalink / raw)
  To: mengdong.lin; +Cc: alsa-devel

Hello Mengdong Lin,

The patch eea3dd4f1247: "ASoC: topology: Only free TLV for volume
mixers of a widget" from Nov 25, 2016, leads to the following static
checker warning:

	sound/soc/soc-topology.c:1566 soc_tplg_dapm_widget_create()
	error: uninitialized symbol 'kcontrol_type'.

sound/soc/soc-topology.c
  1440  static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
  1441          struct snd_soc_tplg_dapm_widget *w)
  1442  {
  1443          struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
  1444          struct snd_soc_dapm_widget template, *widget;
  1445          struct snd_soc_tplg_ctl_hdr *control_hdr;
  1446          struct snd_soc_card *card = tplg->comp->card;
  1447          unsigned int kcontrol_type;
                             ^^^^^^^^^^^^^
  1448          int ret = 0;
  1449  
  1450          if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
  1451                  SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
  1452                  return -EINVAL;
  1453          if (strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
  1454                  SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
  1455                  return -EINVAL;
  1456  
  1457          dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n",
  1458                  w->name, w->id);
  1459  
  1460          memset(&template, 0, sizeof(template));
  1461  
  1462          /* map user to kernel widget ID */
  1463          template.id = get_widget_id(w->id);
  1464          if (template.id < 0)
  1465                  return template.id;
  1466  
  1467          template.name = kstrdup(w->name, GFP_KERNEL);
  1468          if (!template.name)
  1469                  return -ENOMEM;
  1470          template.sname = kstrdup(w->sname, GFP_KERNEL);
  1471          if (!template.sname) {
  1472                  ret = -ENOMEM;
  1473                  goto err;
  1474          }
  1475          template.reg = w->reg;
  1476          template.shift = w->shift;
  1477          template.mask = w->mask;
  1478          template.subseq = w->subseq;
  1479          template.on_val = w->invert ? 0 : 1;
  1480          template.off_val = w->invert ? 1 : 0;
  1481          template.ignore_suspend = w->ignore_suspend;
  1482          template.event_flags = w->event_flags;
  1483          template.dobj.index = tplg->index;
  1484  
  1485          tplg->pos +=
  1486                  (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size);
  1487          if (w->num_kcontrols == 0) {
  1488                  template.num_kcontrols = 0;
  1489                  goto widget;

Assume we hit this goto.

  1490          }
  1491  
  1492          control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
  1493          dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n",
  1494                  w->name, w->num_kcontrols, control_hdr->type);

[ snip ]

  1546  
  1547  widget:
  1548          ret = soc_tplg_widget_load(tplg, &template, w);
  1549          if (ret < 0)
  1550                  goto hdr_err;
  1551  
  1552          /* card dapm mutex is held by the core if we are loading topology
  1553           * data during sound card init. */
  1554          if (card->instantiated)
  1555                  widget = snd_soc_dapm_new_control(dapm, &template);
  1556          else
  1557                  widget = snd_soc_dapm_new_control_unlocked(dapm, &template);
  1558          if (widget == NULL) {
  1559                  dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n",
  1560                          w->name);
  1561                  ret = -ENOMEM;
  1562                  goto hdr_err;
  1563          }
  1564  
  1565          widget->dobj.type = SND_SOC_DOBJ_WIDGET;
  1566          widget->dobj.widget.kcontrol_type = kcontrol_type;

Then it's not initialized here.  I don't know if this causes an issue
beyond the static checker warning.

  1567          widget->dobj.ops = tplg->ops;
  1568          widget->dobj.index = tplg->index;
  1569          kfree(template.sname);

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [bug report] ASoC: topology: Only free TLV for volume mixers of a widget
  2016-12-08 13:32 [bug report] ASoC: topology: Only free TLV for volume mixers of a widget Dan Carpenter
@ 2016-12-08 20:47 ` Takashi Sakamoto
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Sakamoto @ 2016-12-08 20:47 UTC (permalink / raw)
  To: Dan Carpenter, mengdong.lin; +Cc: alsa-devel

Hi Dan,

On Dec 8 2016 22:32, Dan Carpenter wrote:
> Hello Mengdong Lin,
>
> The patch eea3dd4f1247: "ASoC: topology: Only free TLV for volume
> mixers of a widget" from Nov 25, 2016, leads to the following static
> checker warning:
>
> 	sound/soc/soc-topology.c:1566 soc_tplg_dapm_widget_create()
> 	error: uninitialized symbol 'kcontrol_type'.
>
> sound/soc/soc-topology.c
>   1440  static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
>   1441          struct snd_soc_tplg_dapm_widget *w)
>   1442  {
>   1443          struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
>   1444          struct snd_soc_dapm_widget template, *widget;
>   1445          struct snd_soc_tplg_ctl_hdr *control_hdr;
>   1446          struct snd_soc_card *card = tplg->comp->card;
>   1447          unsigned int kcontrol_type;
>                              ^^^^^^^^^^^^^
>   1448          int ret = 0;
>   1449
>   1450          if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
>   1451                  SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
>   1452                  return -EINVAL;
>   1453          if (strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
>   1454                  SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
>   1455                  return -EINVAL;
>   1456
>   1457          dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n",
>   1458                  w->name, w->id);
>   1459
>   1460          memset(&template, 0, sizeof(template));
>   1461
>   1462          /* map user to kernel widget ID */
>   1463          template.id = get_widget_id(w->id);
>   1464          if (template.id < 0)
>   1465                  return template.id;
>   1466
>   1467          template.name = kstrdup(w->name, GFP_KERNEL);
>   1468          if (!template.name)
>   1469                  return -ENOMEM;
>   1470          template.sname = kstrdup(w->sname, GFP_KERNEL);
>   1471          if (!template.sname) {
>   1472                  ret = -ENOMEM;
>   1473                  goto err;
>   1474          }
>   1475          template.reg = w->reg;
>   1476          template.shift = w->shift;
>   1477          template.mask = w->mask;
>   1478          template.subseq = w->subseq;
>   1479          template.on_val = w->invert ? 0 : 1;
>   1480          template.off_val = w->invert ? 1 : 0;
>   1481          template.ignore_suspend = w->ignore_suspend;
>   1482          template.event_flags = w->event_flags;
>   1483          template.dobj.index = tplg->index;
>   1484
>   1485          tplg->pos +=
>   1486                  (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size);
>   1487          if (w->num_kcontrols == 0) {
>   1488                  template.num_kcontrols = 0;
>   1489                  goto widget;
>
> Assume we hit this goto.
>
>   1490          }
>   1491
>   1492          control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
>   1493          dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n",
>   1494                  w->name, w->num_kcontrols, control_hdr->type);
>
> [ snip ]
>
>   1546
>   1547  widget:
>   1548          ret = soc_tplg_widget_load(tplg, &template, w);
>   1549          if (ret < 0)
>   1550                  goto hdr_err;
>   1551
>   1552          /* card dapm mutex is held by the core if we are loading topology
>   1553           * data during sound card init. */
>   1554          if (card->instantiated)
>   1555                  widget = snd_soc_dapm_new_control(dapm, &template);
>   1556          else
>   1557                  widget = snd_soc_dapm_new_control_unlocked(dapm, &template);
>   1558          if (widget == NULL) {
>   1559                  dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n",
>   1560                          w->name);
>   1561                  ret = -ENOMEM;
>   1562                  goto hdr_err;
>   1563          }
>   1564
>   1565          widget->dobj.type = SND_SOC_DOBJ_WIDGET;
>   1566          widget->dobj.widget.kcontrol_type = kcontrol_type;
>
> Then it's not initialized here.  I don't know if this causes an issue
> beyond the static checker warning.
>
>   1567          widget->dobj.ops = tplg->ops;
>   1568          widget->dobj.index = tplg->index;
>   1569          kfree(template.sname);

Sparse generates below warnings, as well.

sound/soc/soc-topology.c:2134:60: warning: Using plain integer as NULL 
pointer
sound/soc/soc-topology.c: In function ‘soc_tplg_dapm_widget_create’:
/home/mocchi/asoc/sound/soc/soc-topology.c:1566:36: warning: 
‘kcontrol_type’ may be used uninitialized in this function 
[-Wmaybe-uninitialized]
   widget->dobj.widget.kcontrol_type = kcontrol_type;
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~

I guess that one of 'SND_SOC_TPLG_TYPE_xxx' macro should be assigned to 
the variable, while the macro set has no apparent initial value. I have 
no idea to fix this issue. If were this related to 
'snd_ctl_elem_type_t', SNDRV_CTL_ELEM_TYPE_NONE could be available...


Regards

Takashi Sakamoto

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-12-08 20:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-12-08 13:32 [bug report] ASoC: topology: Only free TLV for volume mixers of a widget Dan Carpenter
2016-12-08 20:47 ` Takashi Sakamoto

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.