diff options
author | Espen Fjellvær Olsen <espen@mrfjo.org> | 2013-01-08 20:54:02 +0100 |
---|---|---|
committer | Espen Fjellvær Olsen <espen@mrfjo.org> | 2013-01-09 18:01:21 +0100 |
commit | 5528b5d5c43f0c38903db0e672581ec4176ae523 (patch) | |
tree | 60dcbd69fced4f5bb21d41b4780560503d1f29d2 | |
parent | 3698988b7d3542ae549ef3ab93173840d9137f2e (diff) | |
download | kernel_samsung_smdk4412-5528b5d5c43f0c38903db0e672581ec4176ae523.zip kernel_samsung_smdk4412-5528b5d5c43f0c38903db0e672581ec4176ae523.tar.gz kernel_samsung_smdk4412-5528b5d5c43f0c38903db0e672581ec4176ae523.tar.bz2 |
Revert "exynos-mem: Fix major security hole"
This reverts commit 9c1d0f487d28417858778d094f2eb98eb47ea2f7.
-rw-r--r-- | arch/arm/mach-exynos/mach-midas.c | 4 | ||||
-rw-r--r-- | arch/arm/plat-s5p/reserve_mem.c | 14 | ||||
-rw-r--r-- | drivers/char/exynos_mem.c | 77 | ||||
-rw-r--r-- | include/linux/exynos_mem.h | 9 |
4 files changed, 1 insertions, 103 deletions
diff --git a/arch/arm/mach-exynos/mach-midas.c b/arch/arm/mach-exynos/mach-midas.c index ddc2d14..fc6c224 100644 --- a/arch/arm/mach-exynos/mach-midas.c +++ b/arch/arm/mach-exynos/mach-midas.c @@ -58,7 +58,6 @@ #ifdef CONFIG_DMA_CMA #include <linux/dma-contiguous.h> -#include <linux/exynos_mem.h> #endif #include <asm/mach/arch.h> @@ -3424,14 +3423,11 @@ static void __init exynos4_reserve(void) CONFIG_VIDEO_SAMSUNG_MEMSIZE_FIMC1 * SZ_1K, 0x65800000, 0); if (ret != 0) panic("alloc failed for FIMC1\n"); - cma_region_descriptor_add(s3c_device_fimc1.name, 0x65800000, - CONFIG_VIDEO_SAMSUNG_MEMSIZE_FIMC1 * SZ_1K); #endif #if defined(CONFIG_USE_MFC_CMA) && defined(CONFIG_MACH_M0) ret = dma_declare_contiguous(&s5p_device_mfc.dev, 0x02800000, 0x5C800000, 0); - cma_region_descriptor_add(s5p_device_mfc.name, 0x5C800000, 0x02800000); #endif if (ret != 0) printk(KERN_ERR "%s Fail\n", __func__); diff --git a/arch/arm/plat-s5p/reserve_mem.c b/arch/arm/plat-s5p/reserve_mem.c index 32ac973..557938a 100644 --- a/arch/arm/plat-s5p/reserve_mem.c +++ b/arch/arm/plat-s5p/reserve_mem.c @@ -22,7 +22,6 @@ #ifdef CONFIG_CMA #include <linux/cma.h> -#include <linux/exynos_mem.h> void __init s5p_cma_region_reserve(struct cma_region *regions_normal, struct cma_region *regions_secure, size_t align_secure, const char *map) @@ -70,9 +69,6 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, pr_debug("S5P/CMA: " "Reserved 0x%08x/0x%08x for '%s'\n", reg->start, reg->size, reg->name); - - cma_region_descriptor_add(reg->name, reg->start, reg->size); - paddr = reg->start; } else { paddr = memblock_find_in_range(0, @@ -92,8 +88,6 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, pr_info("S5P/CMA: Reserved 0x%08x/0x%08x for '%s'\n", reg->start, reg->size, reg->name); - - cma_region_descriptor_add(reg->name, reg->start, reg->size); } else { pr_err("S5P/CMA: No free space in memory for '%s'\n", reg->name); @@ -161,9 +155,6 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, } if (paddr_last) { - pr_info("S5P/CMA: " - "Reserved 0x%08x/0x%08x for 'secure_region'\n", - paddr_last, size_secure); #ifndef CONFIG_DMA_CMA while (memblock_reserve(paddr_last, size_secure)) paddr_last -= align_secure; @@ -174,6 +165,7 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, paddr_last -= align_secure; } #endif + do { #ifndef CONFIG_DMA_CMA reg->start = paddr_last; @@ -199,7 +191,6 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, if (memblock_reserve(reg->start, reg->size)) panic("memblock\n"); - #endif } else { reg->start = paddr_last; @@ -210,9 +201,6 @@ void __init s5p_cma_region_reserve(struct cma_region *regions_normal, pr_info("S5P/CMA: " "Reserved 0x%08x/0x%08x for '%s'\n", reg->start, reg->size, reg->name); - - cma_region_descriptor_add(reg->name, reg->start, reg->size); - if (cma_early_region_register(reg)) { memblock_free(reg->start, reg->size); pr_err("S5P/CMA: " diff --git a/drivers/char/exynos_mem.c b/drivers/char/exynos_mem.c index fdbaf4d..85c7a29 100644 --- a/drivers/char/exynos_mem.c +++ b/drivers/char/exynos_mem.c @@ -241,47 +241,14 @@ static struct vm_operations_struct exynos_mem_ops = { .close = exynos_mem_mmap_close, }; -static struct simple_cma_descriptor cmad_container[CMA_REGION_COUNT]; -static int cmad_container_stored = 0; - -void cma_region_descriptor_add(const char *name, int start, int size) -{ - int i; - - pr_info("[%s] adding [%s] (0x%08x)-(0x%08x)\n", - __func__, name, start, size); - - if(cmad_container_stored == CMA_REGION_COUNT - 1) - return; - - i = cmad_container_stored; - - cmad_container[i].name = name; - cmad_container[i].start = start; - cmad_container[i].size = size; - - cmad_container_stored++; - -} - int exynos_mem_mmap(struct file *filp, struct vm_area_struct *vma) { - -/* Devices not having DMA CMA acess shouldn't be using this in any case at all */ -#ifndef CONFIG_DMA_CMA - return -EINVAL; -#endif - struct exynos_mem *mem = (struct exynos_mem *)filp->private_data; bool cacheable = mem->cacheable; dma_addr_t start = 0; u32 pfn = 0; u32 size = vma->vm_end - vma->vm_start; - int i, allowed; - struct simple_cma_descriptor *b; - allowed = false; - if (vma->vm_pgoff) { start = vma->vm_pgoff << PAGE_SHIFT; pfn = vma->vm_pgoff; @@ -290,50 +257,6 @@ int exynos_mem_mmap(struct file *filp, struct vm_area_struct *vma) pfn = mem->phybase; } - pr_info("[%s] requesting access to (0x%08x)-(0x%08x)\n", - __func__, start, (start + size)); - - b = (struct simple_cma_descriptor*)&cmad_container; - - /* Go over all of the defined CMA blocks */ - for(i = 0; i < cmad_container_stored; i++) { - - pr_info("[%s] Checking space paddr(0x%08x)-(0x%08x) from '%s'\n", - __func__, b->start, (b->start + b->size), b->name); - - /* Check if the requested space is within this current CMA block */ - if(start >= b->start && (start + size) <= (b->start + b->size)){ - - /* Further only conditionally whitelist spaces that we know - * break device functionality if we don't allow access. - * - * Add exceptions as we go. - */ - - if(strcmp(b->name, "s3c-fimc") == 0) { - allowed = true; - pr_info("[%s] Accessing space 0x%08x/0x%08x for '%s'\n", - __func__, b->start, b->size, b->name); - } - else{ - pr_info("[%s] No love for '%s' wanting (0x%08x)-(0x%08x) in (0x%08x)-(0x%08x)\n", - __func__, b->name, start, (start + size), b->start, (b->start + b->size)); - } - - } - - b++; - } - - if (!allowed) { - /* The requested memory space isn't in any CMA block, deny access */ - pr_err("[%s] invalid paddr(0x%08x)-(0x%08x), accessing outside of DMA spaces\n", - __func__, start, (start + size)); - return -EINVAL; - } - - /* The check below doesn't matter anymore */ - /* TODO: currently lowmem is only avaiable */ if ((phys_to_virt(start) < (void *)PAGE_OFFSET) || (phys_to_virt(start) >= high_memory)) { diff --git a/include/linux/exynos_mem.h b/include/linux/exynos_mem.h index 3ed0bd6..9c7bed9 100644 --- a/include/linux/exynos_mem.h +++ b/include/linux/exynos_mem.h @@ -22,13 +22,4 @@ struct exynos_mem_flush_range { size_t length; }; -#define CMA_REGION_COUNT (12) -struct simple_cma_descriptor { - const char *name; - int start; - int size; -}; - -extern void cma_region_descriptor_add(const char *name, int start, int size); - #endif /* __INCLUDE_EXYNOS_MEM_H */ |