lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 523/757] rpmsg: smd: Fix a kobj leak in in qcom_smd_parse_edge()
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit e69ee0cf655e8e0c4a80f4319e36019b74f17639 ]

    We need to call of_node_put(node) on the error paths for this function.

    Fixes: 53e2822e56c7 ("rpmsg: Introduce Qualcomm SMD backend")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20200908071841.GA294938@mwanda
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/rpmsg/qcom_smd.c | 32 ++++++++++++++++++++++----------
    1 file changed, 22 insertions(+), 10 deletions(-)

    diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
    index 4abbeea782fa4..19903de6268db 100644
    --- a/drivers/rpmsg/qcom_smd.c
    +++ b/drivers/rpmsg/qcom_smd.c
    @@ -1338,7 +1338,7 @@ static int qcom_smd_parse_edge(struct device *dev,
    ret = of_property_read_u32(node, key, &edge->edge_id);
    if (ret) {
    dev_err(dev, "edge missing %s property\n", key);
    - return -EINVAL;
    + goto put_node;
    }

    edge->remote_pid = QCOM_SMEM_HOST_ANY;
    @@ -1349,32 +1349,37 @@ static int qcom_smd_parse_edge(struct device *dev,
    edge->mbox_client.knows_txdone = true;
    edge->mbox_chan = mbox_request_channel(&edge->mbox_client, 0);
    if (IS_ERR(edge->mbox_chan)) {
    - if (PTR_ERR(edge->mbox_chan) != -ENODEV)
    - return PTR_ERR(edge->mbox_chan);
    + if (PTR_ERR(edge->mbox_chan) != -ENODEV) {
    + ret = PTR_ERR(edge->mbox_chan);
    + goto put_node;
    + }

    edge->mbox_chan = NULL;

    syscon_np = of_parse_phandle(node, "qcom,ipc", 0);
    if (!syscon_np) {
    dev_err(dev, "no qcom,ipc node\n");
    - return -ENODEV;
    + ret = -ENODEV;
    + goto put_node;
    }

    edge->ipc_regmap = syscon_node_to_regmap(syscon_np);
    - if (IS_ERR(edge->ipc_regmap))
    - return PTR_ERR(edge->ipc_regmap);
    + if (IS_ERR(edge->ipc_regmap)) {
    + ret = PTR_ERR(edge->ipc_regmap);
    + goto put_node;
    + }

    key = "qcom,ipc";
    ret = of_property_read_u32_index(node, key, 1, &edge->ipc_offset);
    if (ret < 0) {
    dev_err(dev, "no offset in %s\n", key);
    - return -EINVAL;
    + goto put_node;
    }

    ret = of_property_read_u32_index(node, key, 2, &edge->ipc_bit);
    if (ret < 0) {
    dev_err(dev, "no bit in %s\n", key);
    - return -EINVAL;
    + goto put_node;
    }
    }

    @@ -1385,7 +1390,8 @@ static int qcom_smd_parse_edge(struct device *dev,
    irq = irq_of_parse_and_map(node, 0);
    if (irq < 0) {
    dev_err(dev, "required smd interrupt missing\n");
    - return -EINVAL;
    + ret = irq;
    + goto put_node;
    }

    ret = devm_request_irq(dev, irq,
    @@ -1393,12 +1399,18 @@ static int qcom_smd_parse_edge(struct device *dev,
    node->name, edge);
    if (ret) {
    dev_err(dev, "failed to request smd irq\n");
    - return ret;
    + goto put_node;
    }

    edge->irq = irq;

    return 0;
    +
    +put_node:
    + of_node_put(node);
    + edge->of_node = NULL;
    +
    + return ret;
    }

    /*
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:40    [W:4.335 / U:0.256 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site