]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dmaengine: at_hdmac: fix device leak on of_dma_xlate()
authorJohan Hovold <johan@kernel.org>
Mon, 17 Nov 2025 16:12:43 +0000 (17:12 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Feb 2026 15:44:01 +0000 (16:44 +0100)
commit b9074b2d7a230b6e28caa23165e9d8bc0677d333 upstream.

Make sure to drop the reference taken when looking up the DMA platform
device during of_dma_xlate() when releasing channel resources.

Note that commit 3832b78b3ec2 ("dmaengine: at_hdmac: add missing
put_device() call in at_dma_xlate()") fixed the leak in a couple of
error paths but the reference is still leaking on successful allocation.

Fixes: bbe89c8e3d59 ("at_hdmac: move to generic DMA binding")
Fixes: 3832b78b3ec2 ("dmaengine: at_hdmac: add missing put_device() call in at_dma_xlate()")
Cc: stable@vger.kernel.org # 3.10: 3832b78b3ec2
Cc: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20251117161258.10679-2-johan@kernel.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/dma/at_hdmac.c

index 858bd64f13135f1370a59d2290570189de89415c..0f5134103f91cb98a2ce7c0cd56582e3dff400cc 100644 (file)
@@ -1586,6 +1586,7 @@ static void atc_free_chan_resources(struct dma_chan *chan)
 {
        struct at_dma_chan      *atchan = to_at_dma_chan(chan);
        struct at_dma           *atdma = to_at_dma(chan->device);
+       struct at_dma_slave     *atslave;
        struct at_desc          *desc, *_desc;
        LIST_HEAD(list);
 
@@ -1606,8 +1607,12 @@ static void atc_free_chan_resources(struct dma_chan *chan)
        /*
         * Free atslave allocated in at_dma_xlate()
         */
-       kfree(chan->private);
-       chan->private = NULL;
+       atslave = chan->private;
+       if (atslave) {
+               put_device(atslave->dma_dev);
+               kfree(atslave);
+               chan->private = NULL;
+       }
 
        dev_vdbg(chan2dev(chan), "free_chan_resources: done\n");
 }