Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2b574ba9 authored by Mans Rullgard's avatar Mans Rullgard Committed by Vinod Koul
Browse files

dmaengine: dw: fix potential memory leak in dw_dma_parse_dt()



If the "dma-channels" DT property is missing, the dw_dma_parse_dt()
function return NULL, but not before allocating memory for a struct
dw_dma_platform_data through devres.  If the device supports parameter
detection, the probe still succeeds and the allocated memory is not
released until the device is removed.

Fix this by deferring the allocation until after checking the
"dma-channels" property.

Signed-off-by: default avatarMans Rullgard <mans@mansr.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent 9ff68186
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -103,18 +103,21 @@ dw_dma_parse_dt(struct platform_device *pdev)
	struct device_node *np = pdev->dev.of_node;
	struct device_node *np = pdev->dev.of_node;
	struct dw_dma_platform_data *pdata;
	struct dw_dma_platform_data *pdata;
	u32 tmp, arr[DW_DMA_MAX_NR_MASTERS];
	u32 tmp, arr[DW_DMA_MAX_NR_MASTERS];
	u32 nr_channels;


	if (!np) {
	if (!np) {
		dev_err(&pdev->dev, "Missing DT data\n");
		dev_err(&pdev->dev, "Missing DT data\n");
		return NULL;
		return NULL;
	}
	}


	if (of_property_read_u32(np, "dma-channels", &nr_channels))
		return NULL;

	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
	if (!pdata)
		return NULL;
		return NULL;


	if (of_property_read_u32(np, "dma-channels", &pdata->nr_channels))
	pdata->nr_channels = nr_channels;
		return NULL;


	if (of_property_read_bool(np, "is_private"))
	if (of_property_read_bool(np, "is_private"))
		pdata->is_private = true;
		pdata->is_private = true;