lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.7 016/388] ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
    Date
    From: Xiyu Yang <xiyuyang19@fudan.edu.cn>

    [ Upstream commit a697ae6ea56e23397341b027098c1b11d9ab13da ]

    davinci_mcasp_get_dma_type() invokes dma_request_chan(), which returns a
    reference of the specified dma_chan object to "chan" with increased
    refcnt.

    When davinci_mcasp_get_dma_type() returns, local variable "chan" becomes
    invalid, so the refcount should be decreased to keep refcount balanced.

    The reference counting issue happens in one exception handling path of
    davinci_mcasp_get_dma_type(). When chan device is NULL, the function
    forgets to decrease the refcnt increased by dma_request_chan(), causing
    a refcnt leak.

    Fix this issue by calling dma_release_channel() when chan device is
    NULL.

    Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
    Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
    Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Link: https://lore.kernel.org/r/1587818916-38730-1-git-send-email-xiyuyang19@fudan.edu.cn
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/ti/davinci-mcasp.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
    index 734ffe925c4d..7a7db743dc5b 100644
    --- a/sound/soc/ti/davinci-mcasp.c
    +++ b/sound/soc/ti/davinci-mcasp.c
    @@ -1896,8 +1896,10 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
    PTR_ERR(chan));
    return PTR_ERR(chan);
    }
    - if (WARN_ON(!chan->device || !chan->device->dev))
    + if (WARN_ON(!chan->device || !chan->device->dev)) {
    + dma_release_channel(chan);
    return -EINVAL;
    + }

    if (chan->device->dev->of_node)
    ret = of_property_read_string(chan->device->dev->of_node,
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-18 03:11    [W:4.066 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site