lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 083/717] ASoC: qcom: common: Fix refcounting in qcom_snd_parse_of()
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit 4e59dd249cd513a211e2ecce2cb31f4e29a5ce5b ]

    There are two issues in this function.

    1) We can't drop the refrences on "cpu", "codec" and "platform" before
    we take the reference. This doesn't cause a problem on the first
    iteration because those pointers start as NULL so the of_node_put()
    is a no-op. But on the subsequent iterations, it will lead to a use
    after free.

    2) If the devm_kzalloc() allocation failed then the code returned
    directly instead of cleaning up.

    Fixes: c1e6414cdc37 ("ASoC: qcom: common: Fix refcount imbalance on error")
    Fixes: 1e36ea360ab9 ("ASoC: qcom: common: use modern dai_link style")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20201105125154.GA176426@mwanda
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/qcom/common.c | 13 ++++++++-----
    1 file changed, 8 insertions(+), 5 deletions(-)

    diff --git a/sound/soc/qcom/common.c b/sound/soc/qcom/common.c
    index 54660f126d09e..09af007007007 100644
    --- a/sound/soc/qcom/common.c
    +++ b/sound/soc/qcom/common.c
    @@ -58,7 +58,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
    dlc = devm_kzalloc(dev, 2 * sizeof(*dlc), GFP_KERNEL);
    if (!dlc) {
    ret = -ENOMEM;
    - goto err;
    + goto err_put_np;
    }

    link->cpus = &dlc[0];
    @@ -70,7 +70,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
    ret = of_property_read_string(np, "link-name", &link->name);
    if (ret) {
    dev_err(card->dev, "error getting codec dai_link name\n");
    - goto err;
    + goto err_put_np;
    }

    cpu = of_get_child_by_name(np, "cpu");
    @@ -130,8 +130,10 @@ int qcom_snd_parse_of(struct snd_soc_card *card)
    } else {
    /* DPCM frontend */
    dlc = devm_kzalloc(dev, sizeof(*dlc), GFP_KERNEL);
    - if (!dlc)
    - return -ENOMEM;
    + if (!dlc) {
    + ret = -ENOMEM;
    + goto err;
    + }

    link->codecs = dlc;
    link->num_codecs = 1;
    @@ -158,10 +160,11 @@ int qcom_snd_parse_of(struct snd_soc_card *card)

    return 0;
    err:
    - of_node_put(np);
    of_node_put(cpu);
    of_node_put(codec);
    of_node_put(platform);
    +err_put_np:
    + of_node_put(np);
    return ret;
    }
    EXPORT_SYMBOL(qcom_snd_parse_of);
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:07    [W:2.168 / U:4.448 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site