Commit 097eed103862f9c6a97f2e415e21d1134017b135
1 parent
f106af4e90
Exists in
master
and in
20 other branches
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
mm/mremap.c
... | ... | @@ -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; |