[media] vmalloc_sg: off by one in error handling
authorDan Carpenter <dan.carpenter@oracle.com>
Tue, 5 Aug 2014 08:11:13 +0000 (05:11 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 21 Aug 2014 20:25:31 +0000 (15:25 -0500)
The "i--" needs to happen at the start of the loop or it will try to
release something bogus (probably it will crash) and it won't release
the first ->vaddr_page[].

Fixes: 7b4eeed174b7 ('[media] vmalloc_sg: make sure all pages in vmalloc area are really DMA-ready')

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/v4l2-core/videobuf-dma-sg.c

index 3c8cc023a5a5e3c2718545b8814664fbf02be291..3ff15f1c9d702219b33a43e3df0e9eb07fab93e6 100644 (file)
@@ -253,9 +253,11 @@ int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
        return 0;
 out_free_pages:
        while (i > 0) {
-               void *addr = page_address(dma->vaddr_pages[i]);
-               dma_free_coherent(dma->dev, PAGE_SIZE, addr, dma->dma_addr[i]);
+               void *addr;
+
                i--;
+               addr = page_address(dma->vaddr_pages[i]);
+               dma_free_coherent(dma->dev, PAGE_SIZE, addr, dma->dma_addr[i]);
        }
        kfree(dma->dma_addr);
        dma->dma_addr = NULL;