diff options
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -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); |