forked from Minki/linux
mmc: mmc_spi: add checks for dma mapping error
There is no checks for dma mapping errors in mmc_spi. Tha patch fixes that and by the way it adds dma_unmap_single(ones_dma) that was left on a failure path mmc_spi_probe(). Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
2df9d58fcc
commit
b00663124c
@ -925,6 +925,10 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd,
|
||||
|
||||
dma_addr = dma_map_page(dma_dev, sg_page(sg), 0,
|
||||
PAGE_SIZE, dir);
|
||||
if (dma_mapping_error(dma_dev, dma_addr)) {
|
||||
data->error = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (direction == DMA_TO_DEVICE)
|
||||
t->tx_dma = dma_addr + sg->offset;
|
||||
else
|
||||
@ -1393,10 +1397,12 @@ static int mmc_spi_probe(struct spi_device *spi)
|
||||
host->dma_dev = dev;
|
||||
host->ones_dma = dma_map_single(dev, ones,
|
||||
MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(dev, host->ones_dma))
|
||||
goto fail_ones_dma;
|
||||
host->data_dma = dma_map_single(dev, host->data,
|
||||
sizeof(*host->data), DMA_BIDIRECTIONAL);
|
||||
|
||||
/* REVISIT in theory those map operations can fail... */
|
||||
if (dma_mapping_error(dev, host->data_dma))
|
||||
goto fail_data_dma;
|
||||
|
||||
dma_sync_single_for_cpu(host->dma_dev,
|
||||
host->data_dma, sizeof(*host->data),
|
||||
@ -1462,6 +1468,11 @@ fail_glue_init:
|
||||
if (host->dma_dev)
|
||||
dma_unmap_single(host->dma_dev, host->data_dma,
|
||||
sizeof(*host->data), DMA_BIDIRECTIONAL);
|
||||
fail_data_dma:
|
||||
if (host->dma_dev)
|
||||
dma_unmap_single(host->dma_dev, host->ones_dma,
|
||||
MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE);
|
||||
fail_ones_dma:
|
||||
kfree(host->data);
|
||||
|
||||
fail_nobuf1:
|
||||
|
Loading…
Reference in New Issue
Block a user