aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/mmap.c')
-rw-r--r--mm/mmap.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/mm/mmap.c b/mm/mmap.c
index fa206abb5c9d..3d3e224be771 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1856,7 +1856,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
1856 struct vm_area_struct *vma; 1856 struct vm_area_struct *vma;
1857 struct vm_unmapped_area_info info; 1857 struct vm_unmapped_area_info info;
1858 1858
1859 if (len > TASK_SIZE) 1859 if (len > TASK_SIZE - mmap_min_addr)
1860 return -ENOMEM; 1860 return -ENOMEM;
1861 1861
1862 if (flags & MAP_FIXED) 1862 if (flags & MAP_FIXED)
@@ -1865,7 +1865,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
1865 if (addr) { 1865 if (addr) {
1866 addr = PAGE_ALIGN(addr); 1866 addr = PAGE_ALIGN(addr);
1867 vma = find_vma(mm, addr); 1867 vma = find_vma(mm, addr);
1868 if (TASK_SIZE - len >= addr && 1868 if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
1869 (!vma || addr + len <= vma->vm_start)) 1869 (!vma || addr + len <= vma->vm_start))
1870 return addr; 1870 return addr;
1871 } 1871 }
@@ -1895,7 +1895,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
1895 struct vm_unmapped_area_info info; 1895 struct vm_unmapped_area_info info;
1896 1896
1897 /* requested length too big for entire address space */ 1897 /* requested length too big for entire address space */
1898 if (len > TASK_SIZE) 1898 if (len > TASK_SIZE - mmap_min_addr)
1899 return -ENOMEM; 1899 return -ENOMEM;
1900 1900
1901 if (flags & MAP_FIXED) 1901 if (flags & MAP_FIXED)
@@ -1905,14 +1905,14 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
1905 if (addr) { 1905 if (addr) {
1906 addr = PAGE_ALIGN(addr); 1906 addr = PAGE_ALIGN(addr);
1907 vma = find_vma(mm, addr); 1907 vma = find_vma(mm, addr);
1908 if (TASK_SIZE - len >= addr && 1908 if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
1909 (!vma || addr + len <= vma->vm_start)) 1909 (!vma || addr + len <= vma->vm_start))
1910 return addr; 1910 return addr;
1911 } 1911 }
1912 1912
1913 info.flags = VM_UNMAPPED_AREA_TOPDOWN; 1913 info.flags = VM_UNMAPPED_AREA_TOPDOWN;
1914 info.length = len; 1914 info.length = len;
1915 info.low_limit = PAGE_SIZE; 1915 info.low_limit = max(PAGE_SIZE, mmap_min_addr);
1916 info.high_limit = mm->mmap_base; 1916 info.high_limit = mm->mmap_base;
1917 info.align_mask = 0; 1917 info.align_mask = 0;
1918 addr = vm_unmapped_area(&info); 1918 addr = vm_unmapped_area(&info);