aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvaylo Dimitrov <freemangordon@abv.bg>2013-12-02 09:00:16 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2015-12-06 16:58:09 +0100
commit6acceefa2c1d377fbdeae6c37a376950a395ceb9 (patch)
treef12581e17d2db519cde10ef3e9705d922cee941d
parentfbc520fe764d992c395807fad8522323f40cf6c0 (diff)
downloadkernel_samsung_smdk4412-6acceefa2c1d377fbdeae6c37a376950a395ceb9.zip
kernel_samsung_smdk4412-6acceefa2c1d377fbdeae6c37a376950a395ceb9.tar.gz
kernel_samsung_smdk4412-6acceefa2c1d377fbdeae6c37a376950a395ceb9.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