Commit 097eed103862f9c6a97f2e415e21d1134017b135

Authored by Al Viro
1 parent f106af4e90

fix the arch checks in MREMAP_FIXED case

Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 1 changed file with 17 additions and 2 deletions Side-by-side Diff

... ... @@ -325,6 +325,7 @@
325 325 struct vm_area_struct *vma;
326 326 unsigned long ret = -EINVAL;
327 327 unsigned long charged = 0;
  328 + unsigned long map_flags;
328 329  
329 330 if (new_addr & ~PAGE_MASK)
330 331 goto out;
331 332  
... ... @@ -362,9 +363,23 @@
362 363 goto out;
363 364 }
364 365  
365   - ret = move_vma(vma, addr, old_len, new_len, new_addr);
  366 + map_flags = MAP_FIXED;
  367 + if (vma->vm_flags & VM_MAYSHARE)
  368 + map_flags |= MAP_SHARED;
  369 + ret = arch_mmap_check(new_addr, new_len, map_flags);
  370 + if (ret)
  371 + goto out1;
  372 + ret = get_unmapped_area(vma->vm_file, new_addr, new_len, vma->vm_pgoff +
  373 + ((addr - vma->vm_start) >> PAGE_SHIFT),
  374 + map_flags);
366 375 if (ret & ~PAGE_MASK)
367   - vm_unacct_memory(charged);
  376 + goto out1;
  377 +
  378 + ret = move_vma(vma, addr, old_len, new_len, new_addr);
  379 + if (!(ret & ~PAGE_MASK))
  380 + goto out;
  381 +out1:
  382 + vm_unacct_memory(charged);
368 383  
369 384 out:
370 385 return ret;