ASoC: atmel: Fix error handling in sam9x5_wm8731_driver_probe
authorMiaoqian Lin <linmq006@gmail.com>
Wed, 16 Mar 2022 11:15:30 +0000 (11:15 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 16 Mar 2022 16:39:19 +0000 (16:39 +0000)
The device_node pointer is returned by of_parse_phandle()  with refcount
incremented. We should use of_node_put() on it when done.

This function only calls of_node_put() in the regular path.
And it will cause refcount leak in error path.

Fixes: fdbcb3cba54b ("ASoC: atmel: machine driver for at91sam9x5-wm8731 boards")
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
Reviewed-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Link: https://lore.kernel.org/r/20220316111530.4551-1-linmq006@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/atmel/sam9x5_wm8731.c

index 7c45dc4..99310e4 100644 (file)
@@ -142,7 +142,7 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)
        if (!cpu_np) {
                dev_err(&pdev->dev, "atmel,ssc-controller node missing\n");
                ret = -EINVAL;
-               goto out;
+               goto out_put_codec_np;
        }
        dai->cpus->of_node = cpu_np;
        dai->platforms->of_node = cpu_np;
@@ -153,12 +153,9 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)
        if (ret != 0) {
                dev_err(&pdev->dev, "Failed to set SSC %d for audio: %d\n",
                        ret, priv->ssc_id);
-               goto out;
+               goto out_put_cpu_np;
        }
 
-       of_node_put(codec_np);
-       of_node_put(cpu_np);
-
        ret = devm_snd_soc_register_card(&pdev->dev, card);
        if (ret) {
                dev_err(&pdev->dev, "Platform device allocation failed\n");
@@ -167,10 +164,14 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)
 
        dev_dbg(&pdev->dev, "%s ok\n", __func__);
 
-       return ret;
+       goto out_put_cpu_np;
 
 out_put_audio:
        atmel_ssc_put_audio(priv->ssc_id);
+out_put_cpu_np:
+       of_node_put(cpu_np);
+out_put_codec_np:
+       of_node_put(codec_np);
 out:
        return ret;
 }