aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvaylo Dimitrov <freemangordon@abv.bg>2013-12-02 09:00:16 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2016-02-18 20:51:00 +0100
commit35a3c64544f3eb083aa45870639ba77ffb1b5ec8 (patch)
treedb800228584441a351aaf0d8eace9a0b26a797c7
parent7fbe662a46f3bb994b6f7a9adea731f3d8a5620c (diff)
downloadkernel_samsung_smdk4412-35a3c64544f3eb083aa45870639ba77ffb1b5ec8.zip
kernel_samsung_smdk4412-35a3c64544f3eb083aa45870639ba77ffb1b5ec8.tar.gz
kernel_samsung_smdk4412-35a3c64544f3eb083aa45870639ba77ffb1b5ec8.tar.bz2
Staging: TIDSPBRIDGE: Use vm_iomap_memory for mmap-ing instead of rem ap_pfn_range
This fixes the following bug: ---- Bug Report ---- source file: drivers/staging/tidspbridge/rmgr/drv_interface.c issue : mapping of physical memory without address range checks 259 static int bridge_mmap(struct file *filp, struct vm_area_struct *vma) 260 { 261 u32 status; 262 263 /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */ 264 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 265 266 dev_dbg(bridge, "%s: vm filp %p start %lx end %lx page_prot %ulx " 267 "flags %lx\n", __func__, filp, 268 vma->vm_start, vma->vm_end, vma->vm_page_prot, 269 vma->vm_flags); 270 271 status = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 272 vma->vm_end - vma->vm_start, 273 vma->vm_page_prot); 274 if (status != 0) 275 status = -EAGAIN; 276 277 return status; 278 } The function provides an interface to remap physical memory to user space, but does not provide any checks to ensure that the memory is within the region that should be accessible. Reported-by: Nico Golde <nico@ngolde.de> Reported-by: Fabian Yamaguchi <fabs@goesec.de> Signed-off-by: Ivaylo Dimitrov <freemangordon@abv.bg> Signed-off-by: Pavel Machek <pavel@ucw.cz> [steven@steven676.net: make apply to omapzoom p-android-omap3-3.0 branch] Change-Id: Ie8bb7d62efc5fd5b8f314c229df55c633550dec0 Tested-by: Moritz Bandemer <replicant@posteo.mx>
-rw-r--r--drivers/staging/tidspbridge/rmgr/drv_interface.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c
index c43c7e3..17afc2b 100644
--- a/drivers/staging/tidspbridge/rmgr/drv_interface.c
+++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c
@@ -617,7 +617,9 @@ err:
static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
{
u32 offset = vma->vm_pgoff << PAGE_SHIFT;
- u32 status;
+
+ struct omap_dsp_platform_data *pdata =
+ omap_dspbridge_dev->dev.platform_data;
DBC_ASSERT(vma->vm_start < vma->vm_end);
@@ -628,13 +630,9 @@ static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)
"%lx flags %lx\n", __func__, filp, offset,
vma->vm_start, vma->vm_end, vma->vm_page_prot, vma->vm_flags);
- status = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
- vma->vm_end - vma->vm_start,
- vma->vm_page_prot);
- if (status != 0)
- status = -EAGAIN;
-
- return status;
+ return vm_iomap_memory(vma,
+ pdata->phys_mempool_base,
+ pdata->phys_mempool_size);
}
/* To remove all process resources before removing the process from the