summaryrefslogtreecommitdiff
path: root/mm/mmap.c
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2018-03-09 14:51:30 +1100
committerStephen Rothwell <sfr@canb.auug.org.au>2018-03-09 14:51:30 +1100
commitd55f34411b1b126429a823d06c3124c16283231f (patch)
treeadc58f931a3d88630b62087bc24d8068c52d5203 /mm/mmap.c
parent65c81bccca0787ff28674add50de3937f10608b5 (diff)
parent75e930b5d4746be0627fb07615b583e51e0002db (diff)
Merge branch 'akpm/master'
Diffstat (limited to 'mm/mmap.c')
-rw-r--r--mm/mmap.c11
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)