aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Genoud <richard.genoud@gmail.com>2018-11-27 11:06:34 -0500
committerVinod Koul <vkoul@kernel.org>2018-11-29 09:19:41 -0500
commit98f5f932254b88ce828bc8e4d1642d14e5854caa (patch)
treea2eea3540da857c8403d299f263d732ed89543b3
parent651022382c7f8da46cb4872a545ee1da6d097d2a (diff)
dmaengine: at_hdmac: fix memory leak in at_dma_xlate()
The leak was found when opening/closing a serial port a great number of time, increasing kmalloc-32 in slabinfo. Each time the port was opened, dma_request_slave_channel() was called. Then, in at_dma_xlate(), atslave was allocated with devm_kzalloc() and never freed. (Well, it was free at module unload, but that's not what we want). So, here, kzalloc is more suited for the job since it has to be freed in atc_free_chan_resources(). Cc: stable@vger.kernel.org Fixes: bbe89c8e3d59 ("at_hdmac: move to generic DMA binding") Reported-by: Mario Forner <m.forner@be4energy.com> Suggested-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com> Signed-off-by: Richard Genoud <richard.genoud@gmail.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r--drivers/dma/at_hdmac.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index 7cbac6e8c113..1b7f0ca0d5cd 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -1641,6 +1641,12 @@ static void atc_free_chan_resources(struct dma_chan *chan)
1641 atchan->descs_allocated = 0; 1641 atchan->descs_allocated = 0;
1642 atchan->status = 0; 1642 atchan->status = 0;
1643 1643
1644 /*
1645 * Free atslave allocated in at_dma_xlate()
1646 */
1647 kfree(chan->private);
1648 chan->private = NULL;
1649
1644 dev_vdbg(chan2dev(chan), "free_chan_resources: done\n"); 1650 dev_vdbg(chan2dev(chan), "free_chan_resources: done\n");
1645} 1651}
1646 1652
@@ -1675,7 +1681,7 @@ static struct dma_chan *at_dma_xlate(struct of_phandle_args *dma_spec,
1675 dma_cap_zero(mask); 1681 dma_cap_zero(mask);
1676 dma_cap_set(DMA_SLAVE, mask); 1682 dma_cap_set(DMA_SLAVE, mask);
1677 1683
1678 atslave = devm_kzalloc(&dmac_pdev->dev, sizeof(*atslave), GFP_KERNEL); 1684 atslave = kzalloc(sizeof(*atslave), GFP_KERNEL);
1679 if (!atslave) 1685 if (!atslave)
1680 return NULL; 1686 return NULL;
1681 1687