From: Pankaj Bharadiya <pankaj.laxminarayan.bharad...@intel.com>

[ Upstream commit f8e066521192c7debe59127d90abbe2773577e25 ]

In the loop that adds the uuid_module to the uuid_list list, allocated
memory is not properly freed in the error path free uuid_list whenever
any of the memory allocation in the loop fails to avoid memory leak.

Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharad...@intel.com>
Signed-off-by: Guneshwor Singh <guneshwor.o.si...@intel.com>
Acked-By: Vinod Koul <vinod.k...@intel.com>
Signed-off-by: Mark Brown <broo...@kernel.org>
Signed-off-by: Sasha Levin <alexander.le...@verizon.com>
---
 sound/soc/intel/skylake/skl-sst-utils.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-sst-utils.c 
b/sound/soc/intel/skylake/skl-sst-utils.c
index ea162fbf68e5..d5adc04bb724 100644
--- a/sound/soc/intel/skylake/skl-sst-utils.c
+++ b/sound/soc/intel/skylake/skl-sst-utils.c
@@ -295,6 +295,7 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct 
firmware *fw,
        struct uuid_module *module;
        struct firmware stripped_fw;
        unsigned int safe_file;
+       int ret = 0;
 
        /* Get the FW pointer to derive ADSP header */
        stripped_fw.data = fw->data;
@@ -343,8 +344,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct 
firmware *fw,
 
        for (i = 0; i < num_entry; i++, mod_entry++) {
                module = kzalloc(sizeof(*module), GFP_KERNEL);
-               if (!module)
-                       return -ENOMEM;
+               if (!module) {
+                       ret = -ENOMEM;
+                       goto free_uuid_list;
+               }
 
                uuid_bin = (uuid_le *)mod_entry->uuid.id;
                memcpy(&module->uuid, uuid_bin, sizeof(module->uuid));
@@ -355,8 +358,8 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct 
firmware *fw,
                size = sizeof(int) * mod_entry->instance_max_count;
                module->instance_id = devm_kzalloc(ctx->dev, size, GFP_KERNEL);
                if (!module->instance_id) {
-                       kfree(module);
-                       return -ENOMEM;
+                       ret = -ENOMEM;
+                       goto free_uuid_list;
                }
 
                list_add_tail(&module->list, &skl->uuid_list);
@@ -367,6 +370,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct 
firmware *fw,
        }
 
        return 0;
+
+free_uuid_list:
+       skl_freeup_uuid_list(skl);
+       return ret;
 }
 
 void skl_freeup_uuid_list(struct skl_sst *ctx)
-- 
2.11.0

Reply via email to