[PATCH] dmaengine: sf-pdma: fix double-free of the in-flight descriptor
Haotian Zhang
vulab at iscas.ac.cn
Thu Oct 8 21:23:58 PDT 2026
The descriptors handed to sf_pdma_issue_pending() and
sf_pdma_donebh_tasklet() come from the virt-dma desc_issued list
(sf_pdma_get_first_pending_desc() returns list_first_entry() of that
list), so chan->desc always refers to a descriptor that is still linked
on a virt-dma list while a transfer is in flight.
sf_pdma_free_chan_resources() and sf_pdma_terminate_all() free that
descriptor with kfree(chan->desc) and then call
vchan_get_all_descriptors(), which splices desc_issued into the local
head list, so vchan_dma_desc_free_list() frees the very same object
again through sf_pdma_free_desc(), causing a double-free (and a
use-after-free for the pending tasklets).
Drop the direct kfree(chan->desc) calls so the in-flight descriptor is
freed only once by vchan_dma_desc_free_list().
Fixes: 6973886ad58e ("dmaengine: sf-pdma: add platform DMA support for HiFive Unleashed A00")
Assisted-by: DeepSeek-V4.1-Flash
Signed-off-by: Haotian Zhang <vulab at iscas.ac.cn>
---
drivers/dma/sf-pdma/sf-pdma.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c
index 6f79cc28703e..40f556e198b4 100644
--- a/drivers/dma/sf-pdma/sf-pdma.c
+++ b/drivers/dma/sf-pdma/sf-pdma.c
@@ -144,7 +144,6 @@ static void sf_pdma_free_chan_resources(struct dma_chan *dchan)
spin_lock_irqsave(&chan->vchan.lock, flags);
sf_pdma_disable_request(chan);
- kfree(chan->desc);
chan->desc = NULL;
vchan_get_all_descriptors(&chan->vchan, &head);
sf_pdma_disclaim_chan(chan);
@@ -214,7 +213,6 @@ static int sf_pdma_terminate_all(struct dma_chan *dchan)
spin_lock_irqsave(&chan->vchan.lock, flags);
sf_pdma_disable_request(chan);
- kfree(chan->desc);
chan->desc = NULL;
chan->xfer_err = false;
vchan_get_all_descriptors(&chan->vchan, &head);
--
2.25.1
More information about the linux-riscv
mailing list