ASoC: fsl_mqs: move of_node_put() to the correct location
authorLiliang Ye <yll@hust.edu.cn>
Mon, 3 Apr 2023 15:26:47 +0000 (23:26 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:29 +0000 (23:03 +0900)
[ Upstream commit 1c34890273a020d61d6127ade3f68ed1cb21c16a ]

of_node_put() should have been done directly after
mqs_priv->regmap = syscon_node_to_regmap(gpr_np);
otherwise it creates a reference leak on the success path.

To fix this, of_node_put() is moved to the correct location, and change
all the gotos to direct returns.

Fixes: a9d273671440 ("ASoC: fsl_mqs: Fix error handling in probe")
Signed-off-by: Liliang Ye <yll@hust.edu.cn>
Reviewed-by: Dan Carpenter <error27@gmail.com>
Link: https://lore.kernel.org/r/20230403152647.17638-1-yll@hust.edu.cn
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/fsl/fsl_mqs.c

index 4922e67..32d20d3 100644 (file)
@@ -210,10 +210,10 @@ static int fsl_mqs_probe(struct platform_device *pdev)
                }
 
                mqs_priv->regmap = syscon_node_to_regmap(gpr_np);
+               of_node_put(gpr_np);
                if (IS_ERR(mqs_priv->regmap)) {
                        dev_err(&pdev->dev, "failed to get gpr regmap\n");
-                       ret = PTR_ERR(mqs_priv->regmap);
-                       goto err_free_gpr_np;
+                       return PTR_ERR(mqs_priv->regmap);
                }
        } else {
                regs = devm_platform_ioremap_resource(pdev, 0);
@@ -242,8 +242,7 @@ static int fsl_mqs_probe(struct platform_device *pdev)
        if (IS_ERR(mqs_priv->mclk)) {
                dev_err(&pdev->dev, "failed to get the clock: %ld\n",
                        PTR_ERR(mqs_priv->mclk));
-               ret = PTR_ERR(mqs_priv->mclk);
-               goto err_free_gpr_np;
+               return PTR_ERR(mqs_priv->mclk);
        }
 
        dev_set_drvdata(&pdev->dev, mqs_priv);
@@ -252,13 +251,9 @@ static int fsl_mqs_probe(struct platform_device *pdev)
        ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_fsl_mqs,
                        &fsl_mqs_dai, 1);
        if (ret)
-               goto err_free_gpr_np;
-       return 0;
-
-err_free_gpr_np:
-       of_node_put(gpr_np);
+               return ret;
 
-       return ret;
+       return 0;
 }
 
 static int fsl_mqs_remove(struct platform_device *pdev)