| From dhobsong@igel.co.jp Mon Oct 29 00:53:33 2012 |
| From: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| Date: Mon, 29 Oct 2012 16:50:59 +0900 |
| Subject: [PATCH v2 42/58] ARM: dma-mapping: add more sanity checks in arm_dma_mmap() |
| To: greg@kroah.com, laurent.pinchart@ideasonboard.com, horms@verge.net.au |
| Cc: ltsi-dev@lists.linuxfoundation.org, dhobsong@igel.co.jp |
| Message-ID: <1351497075-32717-43-git-send-email-dhobsong@igel.co.jp> |
| |
| |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| |
| Add some sanity checks and forbid mmaping of buffers into vma areas larger |
| than allocated dma buffer. |
| |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| (cherry picked from commit 50262a4bf38dd70486e9fce2b8235d5ae3e0f627) |
| |
| Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp> |
| --- |
| arch/arm/mm/dma-mapping.c | 14 ++++++++++---- |
| 1 files changed, 10 insertions(+), 4 deletions(-) |
| |
| diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
| index d1dff4a3..6a94d17 100644 |
| --- a/arch/arm/mm/dma-mapping.c |
| +++ b/arch/arm/mm/dma-mapping.c |
| @@ -611,16 +611,22 @@ int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, |
| { |
| int ret = -ENXIO; |
| #ifdef CONFIG_MMU |
| + unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
| + unsigned long nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; |
| unsigned long pfn = dma_to_pfn(dev, dma_addr); |
| + unsigned long off = vma->vm_pgoff; |
| + |
| vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot); |
| |
| if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret)) |
| return ret; |
| |
| - ret = remap_pfn_range(vma, vma->vm_start, |
| - pfn + vma->vm_pgoff, |
| - vma->vm_end - vma->vm_start, |
| - vma->vm_page_prot); |
| + if (off < nr_pages && nr_vma_pages <= (nr_pages - off)) { |
| + ret = remap_pfn_range(vma, vma->vm_start, |
| + pfn + off, |
| + vma->vm_end - vma->vm_start, |
| + vma->vm_page_prot); |
| + } |
| #endif /* CONFIG_MMU */ |
| |
| return ret; |
| -- |
| 1.7.5.4 |
| |