cpufreq: qcom-nvmem: fix memory leaks in probe error paths
authorJavier Carrasco <javier.carrasco.cruz@gmail.com>
Thu, 23 May 2024 21:24:59 +0000 (23:24 +0200)
committerViresh Kumar <viresh.kumar@linaro.org>
Tue, 28 May 2024 06:09:06 +0000 (11:39 +0530)
The code refactoring added new error paths between the np device node
allocation and the call to of_node_put(), which leads to memory leaks if
any of those errors occur.

Add the missing of_node_put() in the error paths that require it.

Cc: stable@vger.kernel.org
Fixes: 57f2f8b4aa0c ("cpufreq: qcom: Refactor the driver to make it easier to extend")
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
drivers/cpufreq/qcom-cpufreq-nvmem.c

index ea05d9d67490256928db445da2aa24b04d250159..5004e1dbc75220a518f5f8e3f123b7cda7c64f8c 100644 (file)
@@ -480,23 +480,30 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
 
        drv = devm_kzalloc(&pdev->dev, struct_size(drv, cpus, num_possible_cpus()),
                           GFP_KERNEL);
-       if (!drv)
+       if (!drv) {
+               of_node_put(np);
                return -ENOMEM;
+       }
 
        match = pdev->dev.platform_data;
        drv->data = match->data;
-       if (!drv->data)
+       if (!drv->data) {
+               of_node_put(np);
                return -ENODEV;
+       }
 
        if (drv->data->get_version) {
                speedbin_nvmem = of_nvmem_cell_get(np, NULL);
-               if (IS_ERR(speedbin_nvmem))
+               if (IS_ERR(speedbin_nvmem)) {
+                       of_node_put(np);
                        return dev_err_probe(cpu_dev, PTR_ERR(speedbin_nvmem),
                                             "Could not get nvmem cell\n");
+               }
 
                ret = drv->data->get_version(cpu_dev,
                                                        speedbin_nvmem, &pvs_name, drv);
                if (ret) {
+                       of_node_put(np);
                        nvmem_cell_put(speedbin_nvmem);
                        return ret;
                }