dmaengine: dw: fix potential memory leak in dw_dma_parse_dt()
authorMans Rullgard <mans@mansr.com>
Thu, 17 Dec 2015 23:30:57 +0000 (23:30 +0000)
committerVinod Koul <vinod.koul@intel.com>
Fri, 18 Dec 2015 05:29:32 +0000 (10:59 +0530)
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: Mans Rullgard <mans@mansr.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/dw/platform.c

index 68a4815750b514bcd94a312885607a83db7d99cf..5a417bbdfbd74191f88ffc2eb3daaef247598960 100644 (file)
@@ -103,18 +103,21 @@ dw_dma_parse_dt(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        struct dw_dma_platform_data *pdata;
        u32 tmp, arr[DW_DMA_MAX_NR_MASTERS];
+       u32 nr_channels;
 
        if (!np) {
                dev_err(&pdev->dev, "Missing DT data\n");
                return NULL;
        }
 
+       if (of_property_read_u32(np, "dma-channels", &nr_channels))
+               return NULL;
+
        pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata)
                return NULL;
 
-       if (of_property_read_u32(np, "dma-channels", &pdata->nr_channels))
-               return NULL;
+       pdata->nr_channels = nr_channels;
 
        if (of_property_read_bool(np, "is_private"))
                pdata->is_private = true;