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 =
|
data->widget =
|
||||||
snd_soc_dapm_new_control_unlocked(widget->dapm,
|
snd_soc_dapm_new_control_unlocked(widget->dapm,
|
||||||
&template);
|
&template);
|
||||||
|
kfree(name);
|
||||||
if (!data->widget) {
|
if (!data->widget) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_name;
|
goto err_data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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(
|
data->widget = snd_soc_dapm_new_control_unlocked(
|
||||||
widget->dapm, &template);
|
widget->dapm, &template);
|
||||||
|
kfree(name);
|
||||||
if (!data->widget) {
|
if (!data->widget) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_name;
|
goto err_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_soc_dapm_add_path(widget->dapm, data->widget,
|
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;
|
return 0;
|
||||||
|
|
||||||
err_name:
|
|
||||||
kfree(name);
|
|
||||||
err_data:
|
err_data:
|
||||||
kfree(data);
|
kfree(data);
|
||||||
return ret;
|
return ret;
|
||||||
@ -418,8 +418,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
|
|||||||
static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
|
static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
|
||||||
{
|
{
|
||||||
struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
|
struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
|
||||||
if (data->widget)
|
|
||||||
kfree(data->widget->name);
|
|
||||||
kfree(data->wlist);
|
kfree(data->wlist);
|
||||||
kfree(data);
|
kfree(data);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user