Re: [PATCH v5] ASoC: topology: Add support for multiple kcontrol types to a widget

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

 



Hi Jaska,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on asoc/for-next]
[also build test WARNING on v5.12 next-20210506]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Jaska-Uimonen/ASoC-topology-Add-support-for-multiple-kcontrol-types-to-a-widget/20210506-225954
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>


cocci warnings: (new ones prefixed by >>)
>> sound/soc/soc-topology.c:1578:1-6: WARNING: invalid free of devm_ allocated data

vim +1578 sound/soc/soc-topology.c

  1417	
  1418	static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
  1419		struct snd_soc_tplg_dapm_widget *w)
  1420	{
  1421		struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
  1422		struct snd_soc_dapm_widget template, *widget;
  1423		struct snd_soc_tplg_ctl_hdr *control_hdr;
  1424		struct snd_soc_card *card = tplg->comp->card;
  1425		unsigned int *kcontrol_type;
  1426		struct snd_kcontrol_new *kc;
  1427		int mixer_count = 0;
  1428		int bytes_count = 0;
  1429		int enum_count = 0;
  1430		int ret = 0;
  1431		int i;
  1432	
  1433		if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
  1434			SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
  1435			return -EINVAL;
  1436		if (strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
  1437			SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
  1438			return -EINVAL;
  1439	
  1440		dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n",
  1441			w->name, w->id);
  1442	
  1443		memset(&template, 0, sizeof(template));
  1444	
  1445		/* map user to kernel widget ID */
  1446		template.id = get_widget_id(le32_to_cpu(w->id));
  1447		if ((int)template.id < 0)
  1448			return template.id;
  1449	
  1450		/* strings are allocated here, but used and freed by the widget */
  1451		template.name = kstrdup(w->name, GFP_KERNEL);
  1452		if (!template.name)
  1453			return -ENOMEM;
  1454		template.sname = kstrdup(w->sname, GFP_KERNEL);
  1455		if (!template.sname) {
  1456			ret = -ENOMEM;
  1457			goto err;
  1458		}
  1459		template.reg = le32_to_cpu(w->reg);
  1460		template.shift = le32_to_cpu(w->shift);
  1461		template.mask = le32_to_cpu(w->mask);
  1462		template.subseq = le32_to_cpu(w->subseq);
  1463		template.on_val = w->invert ? 0 : 1;
  1464		template.off_val = w->invert ? 1 : 0;
  1465		template.ignore_suspend = le32_to_cpu(w->ignore_suspend);
  1466		template.event_flags = le16_to_cpu(w->event_flags);
  1467		template.dobj.index = tplg->index;
  1468	
  1469		tplg->pos +=
  1470			(sizeof(struct snd_soc_tplg_dapm_widget) +
  1471			 le32_to_cpu(w->priv.size));
  1472	
  1473		if (w->num_kcontrols == 0) {
  1474			template.num_kcontrols = 0;
  1475			goto widget;
  1476		}
  1477	
  1478		control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
  1479		dev_dbg(tplg->dev, "ASoC: template %s has %d controls of type %x\n",
  1480			w->name, w->num_kcontrols, control_hdr->type);
  1481	
  1482		template.num_kcontrols = le32_to_cpu(w->num_kcontrols);
  1483		kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL);
  1484		if (!kc)
  1485			goto err;
  1486	
  1487		kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int),
  1488					     GFP_KERNEL);
  1489		if (!kcontrol_type)
  1490			goto err;
  1491	
  1492		for (i = 0; i < w->num_kcontrols; i++) {
  1493			control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos;
  1494			switch (le32_to_cpu(control_hdr->ops.info)) {
  1495			case SND_SOC_TPLG_CTL_VOLSW:
  1496			case SND_SOC_TPLG_CTL_STROBE:
  1497			case SND_SOC_TPLG_CTL_VOLSW_SX:
  1498			case SND_SOC_TPLG_CTL_VOLSW_XR_SX:
  1499			case SND_SOC_TPLG_CTL_RANGE:
  1500			case SND_SOC_TPLG_DAPM_CTL_VOLSW:
  1501				/* volume mixer */
  1502				kc[i].index = mixer_count;
  1503				kcontrol_type[i] = SND_SOC_TPLG_TYPE_MIXER;
  1504				mixer_count++;
  1505				ret = soc_tplg_dapm_widget_dmixer_create(tplg, &kc[i]);
  1506				if (ret < 0)
  1507					goto hdr_err;
  1508				break;
  1509			case SND_SOC_TPLG_CTL_ENUM:
  1510			case SND_SOC_TPLG_CTL_ENUM_VALUE:
  1511			case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE:
  1512			case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT:
  1513			case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE:
  1514				/* enumerated mixer */
  1515				kc[i].index = enum_count;
  1516				kcontrol_type[i] = SND_SOC_TPLG_TYPE_ENUM;
  1517				enum_count++;
  1518				ret = soc_tplg_dapm_widget_denum_create(tplg, &kc[i]);
  1519				if (ret < 0)
  1520					goto hdr_err;
  1521				break;
  1522			case SND_SOC_TPLG_CTL_BYTES:
  1523				/* bytes control */
  1524				kc[i].index = bytes_count;
  1525				kcontrol_type[i] = SND_SOC_TPLG_TYPE_BYTES;
  1526				bytes_count++;
  1527				ret = soc_tplg_dapm_widget_dbytes_create(tplg, &kc[i]);
  1528				if (ret < 0)
  1529					goto hdr_err;
  1530				break;
  1531			default:
  1532				dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n",
  1533					control_hdr->ops.get, control_hdr->ops.put,
  1534					le32_to_cpu(control_hdr->ops.info));
  1535				ret = -EINVAL;
  1536				goto hdr_err;
  1537			}
  1538		}
  1539	
  1540		template.kcontrol_news = kc;
  1541	
  1542	widget:
  1543		ret = soc_tplg_widget_load(tplg, &template, w);
  1544		if (ret < 0)
  1545			goto hdr_err;
  1546	
  1547		/* card dapm mutex is held by the core if we are loading topology
  1548		 * data during sound card init. */
  1549		if (card->instantiated)
  1550			widget = snd_soc_dapm_new_control(dapm, &template);
  1551		else
  1552			widget = snd_soc_dapm_new_control_unlocked(dapm, &template);
  1553		if (IS_ERR(widget)) {
  1554			ret = PTR_ERR(widget);
  1555			goto hdr_err;
  1556		}
  1557	
  1558		widget->dobj.type = SND_SOC_DOBJ_WIDGET;
  1559		widget->dobj.widget.kcontrol_type = kcontrol_type;
  1560		widget->dobj.ops = tplg->ops;
  1561		widget->dobj.index = tplg->index;
  1562		list_add(&widget->dobj.list, &tplg->comp->dobj_list);
  1563	
  1564		ret = soc_tplg_widget_ready(tplg, widget, w);
  1565		if (ret < 0)
  1566			goto ready_err;
  1567	
  1568		kfree(template.sname);
  1569		kfree(template.name);
  1570	
  1571		return 0;
  1572	
  1573	ready_err:
  1574		remove_widget(widget->dapm->component, &widget->dobj, SOC_TPLG_PASS_WIDGET);
  1575		snd_soc_dapm_free_widget(widget);
  1576	hdr_err:
  1577		kfree(template.sname);
> 1578		kfree(kc);
  1579	err:
  1580		kfree(template.name);
  1581		return ret;
  1582	}
  1583	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[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