| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| Date: Sat, 25 Mar 2017 01:48:08 +0300 |
| Subject: irda: vlsi_ir: fix check for DMA mapping errors |
| |
| From: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| |
| |
| [ Upstream commit 6ac3b77a6ffff7513ff86b684aa256ea01c0e5b5 ] |
| |
| vlsi_alloc_ring() checks for DMA mapping errors by comparing |
| returned address with zero, while pci_dma_mapping_error() should be used. |
| |
| Found by Linux Driver Verification project (linuxtesting.org). |
| |
| Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/irda/vlsi_ir.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/irda/vlsi_ir.c |
| +++ b/drivers/net/irda/vlsi_ir.c |
| @@ -418,8 +418,9 @@ static struct vlsi_ring *vlsi_alloc_ring |
| memset(rd, 0, sizeof(*rd)); |
| rd->hw = hwmap + i; |
| rd->buf = kmalloc(len, GFP_KERNEL|GFP_DMA); |
| - if (rd->buf == NULL || |
| - !(busaddr = pci_map_single(pdev, rd->buf, len, dir))) { |
| + if (rd->buf) |
| + busaddr = pci_map_single(pdev, rd->buf, len, dir); |
| + if (rd->buf == NULL || pci_dma_mapping_error(pdev, busaddr)) { |
| if (rd->buf) { |
| net_err_ratelimited("%s: failed to create PCI-MAP for %p\n", |
| __func__, rd->buf); |
| @@ -430,8 +431,7 @@ static struct vlsi_ring *vlsi_alloc_ring |
| rd = r->rd + j; |
| busaddr = rd_get_addr(rd); |
| rd_set_addr_status(rd, 0, 0); |
| - if (busaddr) |
| - pci_unmap_single(pdev, busaddr, len, dir); |
| + pci_unmap_single(pdev, busaddr, len, dir); |
| kfree(rd->buf); |
| rd->buf = NULL; |
| } |