lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 692/849] remoteproc: Fix a memory leak in an error handling path in rproc_handle_vdev()
    Date
    From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

    [ Upstream commit 0374a4ea7269645c46c3eb288526ea072fa19e79 ]

    If 'copy_dma_range_map() fails, the memory allocated for 'rvdev' will leak.
    Move the 'copy_dma_range_map()' call after the device registration so
    that 'rproc_rvdev_release()' can be called to free some resources.

    Also, branch to the error handling path if 'copy_dma_range_map()' instead
    of a direct return to avoid some other leaks.

    Fixes: e0d072782c73 ("dma-mapping: introduce DMA range map, supplanting dma_pfn_offset")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Jim Quinlan <james.quinlan@broadcom.com>
    Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Link: https://lore.kernel.org/r/e6d0dad6620da4fdf847faa903f79b735d35f262.1630755377.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/remoteproc/remoteproc_core.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
    index 7de5905d276ac..f77b0ff55385e 100644
    --- a/drivers/remoteproc/remoteproc_core.c
    +++ b/drivers/remoteproc/remoteproc_core.c
    @@ -556,9 +556,6 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr,
    /* Initialise vdev subdevice */
    snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index);
    rvdev->dev.parent = &rproc->dev;
    - ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent);
    - if (ret)
    - return ret;
    rvdev->dev.release = rproc_rvdev_release;
    dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name);
    dev_set_drvdata(&rvdev->dev, rvdev);
    @@ -568,6 +565,11 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr,
    put_device(&rvdev->dev);
    return ret;
    }
    +
    + ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent);
    + if (ret)
    + goto free_rvdev;
    +
    /* Make device dma capable by inheriting from parent's capabilities */
    set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent));

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 00:40    [W:2.049 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site