[alsa-devel] [bug report] ASoC: topology: Only free TLV for volume mixers of a widget

Takashi Sakamoto o-takashi at sakamocchi.jp
Thu Dec 8 21:47:26 CET 2016


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


More information about the Alsa-devel mailing list