diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2018-03-09 14:51:30 +1100 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2018-03-09 14:51:30 +1100 |
commit | d55f34411b1b126429a823d06c3124c16283231f (patch) | |
tree | adc58f931a3d88630b62087bc24d8068c52d5203 /mm/mmap.c | |
parent | 65c81bccca0787ff28674add50de3937f10608b5 (diff) | |
parent | 75e930b5d4746be0627fb07615b583e51e0002db (diff) |
Merge branch 'akpm/master'
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index dd76ea3dd22e..faf85699f1a1 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1342,6 +1342,10 @@ unsigned long do_mmap(struct file *file, unsigned long addr, if (!(file && path_noexec(&file->f_path))) prot |= PROT_EXEC; + /* force arch specific MAP_FIXED handling in get_unmapped_area */ + if (flags & MAP_FIXED_NOREPLACE) + flags |= MAP_FIXED; + if (!(flags & MAP_FIXED)) addr = round_hint_to_min(addr); @@ -1365,6 +1369,13 @@ unsigned long do_mmap(struct file *file, unsigned long addr, if (offset_in_page(addr)) return addr; + if (flags & MAP_FIXED_NOREPLACE) { + struct vm_area_struct *vma = find_vma(mm, addr); + + if (vma && vma->vm_start <= addr) + return -EEXIST; + } + if (prot == PROT_EXEC) { pkey = execute_only_pkey(mm); if (pkey < 0) |