Take arch_mmap_check() into get_unmapped_area()
Subsystems (3)
PATCH 15/19 Take arch_mmap_check() into get_unmapped_area()
Signed-off-by Al Viro <[email protected]>
--- mm/mmap.c | 14 +++++++++----- mm/mremap.c | 15 +++------------ 2 files changed, 12 insertions(+), 17 deletions(-)
mm/mmap.c +9 -5
@@ -932,13 +932,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,if (!(flags &MAP_FIXED )) addr =round_hint_to_min (addr); - error =arch_mmap_check (addr, len, flags); -if (error) -return error; -/* Careful about overflows.. */ len =PAGE_ALIGN (len); -if (!len || len >TASK_SIZE ) +if (!len)return -ENOMEM ;/* offset overflow? */
@@ -1441,6 +1437,14 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long (*get_area)(struct file *,unsigned long ,unsigned long ,unsigned long ,unsigned long ); +unsigned long error =arch_mmap_check (addr, len, flags); +if (error) +return error; + +/* Careful about overflows.. */ +if (len >TASK_SIZE ) +return -ENOMEM ; + get_area = current->mm->get_unmapped_area;if (file && file->f_op && file->f_op->get_unmapped_area) get_area = file->f_op->get_unmapped_area;
mm/mremap.c +3 -12
@@ -27,10 +27,6 @@#include "internal.h" -#ifndef arch_mmap_check -#define arch_mmap_check (addr, len, flags) (0) -#endif -static pmd_t *get_old_pmd (struct mm_struct *mm,unsigned long addr) {pgd_t *pgd;
@@ -366,9 +362,7 @@ static unsigned long mremap_to(unsigned long addr, map_flags =MAP_FIXED ;if (vma->vm_flags &VM_MAYSHARE ) map_flags |=MAP_SHARED ; - ret =arch_mmap_check (new_addr, new_len, map_flags); -if (ret) - goto out1; + ret =get_unmapped_area (vma->vm_file, new_addr, new_len, vma->vm_pgoff + ((addr - vma->vm_start) >>PAGE_SHIFT ), map_flags);
@@ -388,12 +382,9 @@ out:static int vma_expandable (struct vm_area_struct *vma,unsigned long delta) {unsigned long end = vma->vm_end + delta; -unsigned long max_addr =TASK_SIZE ; -if (vma->vm_next) - max_addr = vma->vm_next->vm_start; -if (max_addr < end || end < vma->vm_end) +if (end < vma->vm_end)/* overflow */ return 0 ; -if (arch_mmap_check (vma->vm_start, end - vma->vm_start,MAP_FIXED )) +if (vma->vm_next && vma->vm_next->vm_start < end)/* intersection */ return 0 ;if (get_unmapped_area (NULL , vma->vm_start, end - vma->vm_start,0 ,MAP_FIXED ) & ~PAGE_MASK )
Signature · 1 line
1.5.6.5