lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 470/879] ASoC: ti: j721e-evm: Fix refcount leak in j721e_soc_probe_*
    Date
    From: Miaoqian Lin <linmq006@gmail.com>

    [ Upstream commit a34840c4eb3278a7c29c9c57a65ce7541c66f9f2 ]

    of_parse_phandle() returns a node pointer with refcount
    incremented, we should use of_node_put() on it when not needed anymore.
    Add missing of_node_put() to avoid refcount leak.

    Fixes: 6748d0559059 ("ASoC: ti: Add custom machine driver for j721e EVM (CPB and IVI)")
    Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
    Link: https://lore.kernel.org/r/20220512111331.44774-1-linmq006@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/ti/j721e-evm.c | 44 ++++++++++++++++++++++++++++++----------
    1 file changed, 33 insertions(+), 11 deletions(-)

    diff --git a/sound/soc/ti/j721e-evm.c b/sound/soc/ti/j721e-evm.c
    index 4077e15ec48b..6a969874c927 100644
    --- a/sound/soc/ti/j721e-evm.c
    +++ b/sound/soc/ti/j721e-evm.c
    @@ -630,17 +630,18 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx,
    codec_node = of_parse_phandle(node, "ti,cpb-codec", 0);
    if (!codec_node) {
    dev_err(priv->dev, "CPB codec node is not provided\n");
    - return -EINVAL;
    + ret = -EINVAL;
    + goto put_dai_node;
    }

    domain = &priv->audio_domains[J721E_AUDIO_DOMAIN_CPB];
    ret = j721e_get_clocks(priv->dev, &domain->codec, "cpb-codec-scki");
    if (ret)
    - return ret;
    + goto put_codec_node;

    ret = j721e_get_clocks(priv->dev, &domain->mcasp, "cpb-mcasp-auxclk");
    if (ret)
    - return ret;
    + goto put_codec_node;

    /*
    * Common Processor Board, two links
    @@ -650,8 +651,10 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx,
    comp_count = 6;
    compnent = devm_kzalloc(priv->dev, comp_count * sizeof(*compnent),
    GFP_KERNEL);
    - if (!compnent)
    - return -ENOMEM;
    + if (!compnent) {
    + ret = -ENOMEM;
    + goto put_codec_node;
    + }

    comp_idx = 0;
    priv->dai_links[*link_idx].cpus = &compnent[comp_idx++];
    @@ -702,6 +705,12 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx,
    (*conf_idx)++;

    return 0;
    +
    +put_codec_node:
    + of_node_put(codec_node);
    +put_dai_node:
    + of_node_put(dai_node);
    + return ret;
    }

    static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx,
    @@ -726,23 +735,25 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx,
    codeca_node = of_parse_phandle(node, "ti,ivi-codec-a", 0);
    if (!codeca_node) {
    dev_err(priv->dev, "IVI codec-a node is not provided\n");
    - return -EINVAL;
    + ret = -EINVAL;
    + goto put_dai_node;
    }

    codecb_node = of_parse_phandle(node, "ti,ivi-codec-b", 0);
    if (!codecb_node) {
    dev_warn(priv->dev, "IVI codec-b node is not provided\n");
    - return 0;
    + ret = 0;
    + goto put_codeca_node;
    }

    domain = &priv->audio_domains[J721E_AUDIO_DOMAIN_IVI];
    ret = j721e_get_clocks(priv->dev, &domain->codec, "ivi-codec-scki");
    if (ret)
    - return ret;
    + goto put_codecb_node;

    ret = j721e_get_clocks(priv->dev, &domain->mcasp, "ivi-mcasp-auxclk");
    if (ret)
    - return ret;
    + goto put_codecb_node;

    /*
    * IVI extension, two links
    @@ -754,8 +765,10 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx,
    comp_count = 8;
    compnent = devm_kzalloc(priv->dev, comp_count * sizeof(*compnent),
    GFP_KERNEL);
    - if (!compnent)
    - return -ENOMEM;
    + if (!compnent) {
    + ret = -ENOMEM;
    + goto put_codecb_node;
    + }

    comp_idx = 0;
    priv->dai_links[*link_idx].cpus = &compnent[comp_idx++];
    @@ -816,6 +829,15 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx,
    (*conf_idx)++;

    return 0;
    +
    +
    +put_codecb_node:
    + of_node_put(codecb_node);
    +put_codeca_node:
    + of_node_put(codeca_node);
    +put_dai_node:
    + of_node_put(dai_node);
    + return ret;
    }

    static int j721e_soc_probe(struct platform_device *pdev)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-08 03:46    [W:2.380 / U:0.756 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site