lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0378/1017] ASoC: atmel: Fix error handling in snd_proto_probe
    Date
    From: Miaoqian Lin <linmq006@gmail.com>

    [ Upstream commit b0bfaf0544d08d093d6211d7ef8816fb0b5b6c75 ]

    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 paths.
    Fix this by calling of_node_put() in error handling too.

    Fixes: a45f8853a5f9 ("ASoC: Add driver for PROTO Audio CODEC (with a WM8731)")
    Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
    Reviewed-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
    Link: https://lore.kernel.org/r/20220308013949.20323-1-linmq006@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/atmel/mikroe-proto.c | 20 ++++++++++++--------
    1 file changed, 12 insertions(+), 8 deletions(-)

    diff --git a/sound/soc/atmel/mikroe-proto.c b/sound/soc/atmel/mikroe-proto.c
    index f9331f7e80fe..5b513ff7fe2d 100644
    --- a/sound/soc/atmel/mikroe-proto.c
    +++ b/sound/soc/atmel/mikroe-proto.c
    @@ -115,7 +115,8 @@ static int snd_proto_probe(struct platform_device *pdev)
    cpu_np = of_parse_phandle(np, "i2s-controller", 0);
    if (!cpu_np) {
    dev_err(&pdev->dev, "i2s-controller missing\n");
    - return -EINVAL;
    + ret = -EINVAL;
    + goto put_codec_node;
    }
    dai->cpus->of_node = cpu_np;
    dai->platforms->of_node = cpu_np;
    @@ -125,7 +126,8 @@ static int snd_proto_probe(struct platform_device *pdev)
    &bitclkmaster, &framemaster);
    if (bitclkmaster != framemaster) {
    dev_err(&pdev->dev, "Must be the same bitclock and frame master\n");
    - return -EINVAL;
    + ret = -EINVAL;
    + goto put_cpu_node;
    }
    if (bitclkmaster) {
    if (codec_np == bitclkmaster)
    @@ -136,18 +138,20 @@ static int snd_proto_probe(struct platform_device *pdev)
    dai_fmt |= snd_soc_daifmt_parse_clock_provider_as_flag(np, NULL);
    }

    - of_node_put(bitclkmaster);
    - of_node_put(framemaster);
    - dai->dai_fmt = dai_fmt;
    -
    - of_node_put(codec_np);
    - of_node_put(cpu_np);

    + dai->dai_fmt = dai_fmt;
    ret = snd_soc_register_card(&snd_proto);
    if (ret && ret != -EPROBE_DEFER)
    dev_err(&pdev->dev,
    "snd_soc_register_card() failed: %d\n", ret);

    +
    +put_cpu_node:
    + of_node_put(bitclkmaster);
    + of_node_put(framemaster);
    + of_node_put(cpu_np);
    +put_codec_node:
    + of_node_put(codec_np);
    return ret;
    }

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-05 14:57    [W:2.738 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site