Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: dw-edma: Add pcim_iomap_table return check

Currently, is missing a null check on a pcim_iomap_table() return value
and this can lead to a null pointer dereference if the desired BAR
wasn't mapped previously.
Fix this by adding a null check and returning -ENOMEM.

Addresses-Coverity: ("Dereference null return")
Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Link: https://lore.kernel.org/r/bc5e6b8632c84660bb6dae454980e9419992ed14.1613674948.git.gustavo.pimentel@synopsys.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Gustavo Pimentel and committed by
Vinod Koul
84b0aa2e b671d098

+15
+15
drivers/dma/dw-edma/dw-edma-pcie.c
··· 240 240 dw->rd_ch_cnt = vsec_data.rd_ch_cnt; 241 241 242 242 dw->rg_region.vaddr = pcim_iomap_table(pdev)[vsec_data.rg.bar]; 243 + if (!dw->rg_region.vaddr) 244 + return -ENOMEM; 245 + 243 246 dw->rg_region.vaddr += vsec_data.rg.off; 244 247 dw->rg_region.paddr = pdev->resource[vsec_data.rg.bar].start; 245 248 dw->rg_region.paddr += vsec_data.rg.off; ··· 255 252 struct dw_edma_block *dt_block = &vsec_data.dt_wr[i]; 256 253 257 254 ll_region->vaddr = pcim_iomap_table(pdev)[ll_block->bar]; 255 + if (!ll_region->vaddr) 256 + return -ENOMEM; 257 + 258 258 ll_region->vaddr += ll_block->off; 259 259 ll_region->paddr = pdev->resource[ll_block->bar].start; 260 260 ll_region->paddr += ll_block->off; 261 261 ll_region->sz = ll_block->sz; 262 262 263 263 dt_region->vaddr = pcim_iomap_table(pdev)[dt_block->bar]; 264 + if (!dt_region->vaddr) 265 + return -ENOMEM; 266 + 264 267 dt_region->vaddr += dt_block->off; 265 268 dt_region->paddr = pdev->resource[dt_block->bar].start; 266 269 dt_region->paddr += dt_block->off; ··· 280 271 struct dw_edma_block *dt_block = &vsec_data.dt_rd[i]; 281 272 282 273 ll_region->vaddr = pcim_iomap_table(pdev)[ll_block->bar]; 274 + if (!ll_region->vaddr) 275 + return -ENOMEM; 276 + 283 277 ll_region->vaddr += ll_block->off; 284 278 ll_region->paddr = pdev->resource[ll_block->bar].start; 285 279 ll_region->paddr += ll_block->off; 286 280 ll_region->sz = ll_block->sz; 287 281 288 282 dt_region->vaddr = pcim_iomap_table(pdev)[dt_block->bar]; 283 + if (!dt_region->vaddr) 284 + return -ENOMEM; 285 + 289 286 dt_region->vaddr += dt_block->off; 290 287 dt_region->paddr = pdev->resource[dt_block->bar].start; 291 288 dt_region->paddr += dt_block->off;