hal: Fix memory leak in audiohal
Memory allocated for platform_set_acdb_metainfo_key() and my_data in
platform specific file, but this memory was not freed. Due to this
memory leak was happening. So, freed memory in platform_deinit() to
avoid memory leak.
Change-Id: Ia93d235a010d56730e0bad2125be7ef80e7d5ca0
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index e74353e..9db6df6 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -2722,6 +2722,17 @@
return my_data;
}
+void platform_release_acdb_metainfo_key(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ struct listnode *node, *tempnode;
+
+ list_for_each_safe(node, tempnode, &my_data->acdb_meta_key_list) {
+ list_remove(node);
+ free(node_to_item(node, struct meta_key_list, list));
+ }
+}
+
void platform_deinit(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
@@ -2770,6 +2781,28 @@
my_data->adev->mixer = NULL;
}
+ int32_t idx;
+
+ for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
+ my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
+ my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].channels_mixer_ctl);
+ my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
+ }
+ }
+
+ /* free acdb_meta_key_list */
+ platform_release_acdb_metainfo_key(platform);
+
free(platform);
/* deinit usb */
audio_extn_usb_deinit();
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 9a5d647..b6f84ca 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -2531,6 +2531,17 @@
return my_data;
}
+void platform_release_acdb_metainfo_key(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ struct listnode *node, *tempnode;
+
+ list_for_each_safe(node, tempnode, &my_data->acdb_meta_key_list) {
+ list_remove(node);
+ free(node_to_item(node, struct meta_key_list, list));
+ }
+}
+
void platform_deinit(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
@@ -2578,6 +2589,28 @@
my_data->adev->mixer = NULL;
}
+ int32_t idx;
+
+ for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
+ my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
+ my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].channels_mixer_ctl);
+ my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
+ }
+ }
+
+ /* free acdb_meta_key_list */
+ platform_release_acdb_metainfo_key(platform);
+
free(platform);
/* deinit usb */
audio_extn_usb_deinit();
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 0fec452..4074694 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -108,6 +108,7 @@
effect_type_t effect_type);
int platform_get_snd_device_bit_width(snd_device_t snd_device);
int platform_set_acdb_metainfo_key(void *platform, char *name, int key);
+void platform_release_acdb_metainfo_key(void *platform);
int platform_get_meta_info_key_from_list(void *platform, char *mod_name);
int platform_set_native_support(int na_mode);
int platform_get_native_support();