ASoC: dapm: Fix kcontrol widget name memory management
The name field of the widget template is only used inside
snd_soc_dapm_new_control_unlocked() which allocates a copy for the actual
widget. This means we need to free the name allocated for the template in
dapm_kcontrol_data_alloc() and not the name of the actual widget in
dapm_kcontrol_free(). Otherwise we get a double free on the widget name and
a memory leak on the template name.
Fixes: 773da9b358
("ASoC: dapm: Append "Autodisable" to autodisable widget names")
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e50b1e06b7
commit
e18077b6e5
|
@ -358,9 +358,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||
data->widget =
|
||||
snd_soc_dapm_new_control_unlocked(widget->dapm,
|
||||
&template);
|
||||
kfree(name);
|
||||
if (!data->widget) {
|
||||
ret = -ENOMEM;
|
||||
goto err_name;
|
||||
goto err_data;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -391,9 +392,10 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||
|
||||
data->widget = snd_soc_dapm_new_control_unlocked(
|
||||
widget->dapm, &template);
|
||||
kfree(name);
|
||||
if (!data->widget) {
|
||||
ret = -ENOMEM;
|
||||
goto err_name;
|
||||
goto err_data;
|
||||
}
|
||||
|
||||
snd_soc_dapm_add_path(widget->dapm, data->widget,
|
||||
|
@ -408,8 +410,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||
|
||||
return 0;
|
||||
|
||||
err_name:
|
||||
kfree(name);
|
||||
err_data:
|
||||
kfree(data);
|
||||
return ret;
|
||||
|
@ -418,8 +418,6 @@ err_data:
|
|||
static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
|
||||
{
|
||||
struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
|
||||
if (data->widget)
|
||||
kfree(data->widget->name);
|
||||
kfree(data->wlist);
|
||||
kfree(data);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue