ASoC: mediatek: mt8183: fix refcount leak in mt8183_mt6358_ts3a227_max98357_dev_probe()
authorWang Yufen <wangyufen@huawei.com>
Mon, 5 Dec 2022 09:56:28 +0000 (17:56 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:14:45 +0000 (13:14 +0100)
[ Upstream commit 38eef3be38ab895959c442702864212cc3beb96c ]

The node returned by of_parse_phandle() with refcount incremented,
of_node_put() needs be called when finish using it. So add it in the
error path in mt8183_mt6358_ts3a227_max98357_dev_probe().

Fixes: 11c0269017b2 ("ASoC: Mediatek: MT8183: Add machine driver with TS3A227")
Signed-off-by: Wang Yufen <wangyufen@huawei.com>
Link: https://lore.kernel.org/r/1670234188-23596-1-git-send-email-wangyufen@huawei.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/mediatek/mt8183/mt8183-mt6358-ts3a227-max98357.c

index a56c1e8..4dab1ee 100644 (file)
@@ -647,8 +647,10 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
        }
 
        card = (struct snd_soc_card *)of_device_get_match_data(&pdev->dev);
-       if (!card)
+       if (!card) {
+               of_node_put(platform_node);
                return -EINVAL;
+       }
        card->dev = &pdev->dev;
 
        ec_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,ec-codec", 0);
@@ -737,8 +739,10 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
        }
 
        priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
+       if (!priv) {
+               ret = -ENOMEM;
+               goto out;
+       }
 
        snd_soc_card_set_drvdata(card, priv);
 
@@ -746,7 +750,8 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
        if (IS_ERR(priv->pinctrl)) {
                dev_err(&pdev->dev, "%s devm_pinctrl_get failed\n",
                        __func__);
-               return PTR_ERR(priv->pinctrl);
+               ret = PTR_ERR(priv->pinctrl);
+               goto out;
        }
 
        for (i = 0; i < PIN_STATE_MAX; i++) {
@@ -779,6 +784,7 @@ mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev)
 
        ret = devm_snd_soc_register_card(&pdev->dev, card);
 
+out:
        of_node_put(platform_node);
        of_node_put(ec_codec);
        of_node_put(hdmi_codec);