diff mbox series

ALSA: hda: fix possible memory leak in azx_codec_configure()

Message ID 20221024122646.1175390-1-yangyingliang@huawei.com (mailing list archive)
State Superseded
Headers show
Series ALSA: hda: fix possible memory leak in azx_codec_configure() | expand

Commit Message

Yang Yingliang Oct. 24, 2022, 12:26 p.m. UTC
If the codec device is registered, after calling snd_hdac_device_unregister(),
codec has already been removed from chip bus, it should call put_device() to
give up reference to free codec and device name.

Fixes: c0f1886de7e1 ("ALSA: hda: intel: Allow repeatedly probing on codec configuration errors")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 sound/pci/hda/hda_controller.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Takashi Iwai Oct. 24, 2022, 2:04 p.m. UTC | #1
On Mon, 24 Oct 2022 14:26:46 +0200,
Yang Yingliang wrote:
> 
> If the codec device is registered, after calling snd_hdac_device_unregister(),
> codec has already been removed from chip bus, it should call put_device() to
> give up reference to free codec and device name.
> 
> Fixes: c0f1886de7e1 ("ALSA: hda: intel: Allow repeatedly probing on codec configuration errors")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>

Hrm, are you sure that this will result in a memory leak?
put_device() is called at snd_hda_codec_unregister() that is invoked
via dev_free callback of the snd_hda_codec object -- which is called
when the top-level driver is removed.  I'm afraid that your patch will
lead to a double-free.


thanks,

Takashi

> ---
>  sound/pci/hda/hda_controller.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
> index 0ff286b7b66b..f6a73ce300a4 100644
> --- a/sound/pci/hda/hda_controller.c
> +++ b/sound/pci/hda/hda_controller.c
> @@ -1257,8 +1257,11 @@ int azx_codec_configure(struct azx *chip)
>  		/* unregister failed codecs if any codec has been probed */
>  		list_for_each_codec_safe(codec, next, &chip->bus) {
>  			if (!codec->configured) {
> +				bool is_registered = device_is_registered(&codec->core.dev);
>  				codec_err(codec, "Unable to configure, disabling\n");
>  				snd_hdac_device_unregister(&codec->core);
> +				if (is_registered)
> +					put_device(&codec->core.dev);
>  			}
>  		}
>  	}
> -- 
> 2.25.1
>
Yang Yingliang Oct. 24, 2022, 3:30 p.m. UTC | #2
Hi,

On 2022/10/24 22:04, Takashi Iwai wrote:
> On Mon, 24 Oct 2022 14:26:46 +0200,
> Yang Yingliang wrote:
>> If the codec device is registered, after calling snd_hdac_device_unregister(),
>> codec has already been removed from chip bus, it should call put_device() to
>> give up reference to free codec and device name.
>>
>> Fixes: c0f1886de7e1 ("ALSA: hda: intel: Allow repeatedly probing on codec configuration errors")
>> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
> Hrm, are you sure that this will result in a memory leak?
> put_device() is called at snd_hda_codec_unregister() that is invoked
> via dev_free callback of the snd_hda_codec object -- which is called
> when the top-level driver is removed.  I'm afraid that your patch will
> lead to a double-free.
Thanks for point out.
I look deeper, the snd device is add to device list of card, but 
snd_hdac_device_unregister()
is just remove the codec from chip bus, and the snd device still in 
device list of card,
at last each of snd device is freed in snd_device_free_all() with 
calling snd_hda_codec_dev_free().

Thanks,
Yang
>
>
> thanks,
>
> Takashi
>
>> ---
>>   sound/pci/hda/hda_controller.c | 3 +++
>>   1 file changed, 3 insertions(+)
>>
>> diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
>> index 0ff286b7b66b..f6a73ce300a4 100644
>> --- a/sound/pci/hda/hda_controller.c
>> +++ b/sound/pci/hda/hda_controller.c
>> @@ -1257,8 +1257,11 @@ int azx_codec_configure(struct azx *chip)
>>   		/* unregister failed codecs if any codec has been probed */
>>   		list_for_each_codec_safe(codec, next, &chip->bus) {
>>   			if (!codec->configured) {
>> +				bool is_registered = device_is_registered(&codec->core.dev);
>>   				codec_err(codec, "Unable to configure, disabling\n");
>>   				snd_hdac_device_unregister(&codec->core);
>> +				if (is_registered)
>> +					put_device(&codec->core.dev);
>>   			}
>>   		}
>>   	}
>> -- 
>> 2.25.1
>>
> .
diff mbox series

Patch

diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index 0ff286b7b66b..f6a73ce300a4 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -1257,8 +1257,11 @@  int azx_codec_configure(struct azx *chip)
 		/* unregister failed codecs if any codec has been probed */
 		list_for_each_codec_safe(codec, next, &chip->bus) {
 			if (!codec->configured) {
+				bool is_registered = device_is_registered(&codec->core.dev);
 				codec_err(codec, "Unable to configure, disabling\n");
 				snd_hdac_device_unregister(&codec->core);
+				if (is_registered)
+					put_device(&codec->core.dev);
 			}
 		}
 	}