diff options
-rw-r--r-- | mm/mremap.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/mm/mremap.c b/mm/mremap.c index 1de98d492ddc..a7c1f9f9b941 100644 --- a/mm/mremap.c +++ b/mm/mremap.c | |||
@@ -277,9 +277,16 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr, | |||
277 | if (old_len > vma->vm_end - addr) | 277 | if (old_len > vma->vm_end - addr) |
278 | goto Efault; | 278 | goto Efault; |
279 | 279 | ||
280 | if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)) { | 280 | /* Need to be careful about a growing mapping */ |
281 | if (new_len > old_len) | 281 | if (new_len > old_len) { |
282 | unsigned long pgoff; | ||
283 | |||
284 | if (vma->vm_flags & (VM_DONTEXPAND | VM_PFNMAP)) | ||
282 | goto Efault; | 285 | goto Efault; |
286 | pgoff = (addr - vma->vm_start) >> PAGE_SHIFT; | ||
287 | pgoff += vma->vm_pgoff; | ||
288 | if (pgoff + (new_len >> PAGE_SHIFT) < pgoff) | ||
289 | goto Einval; | ||
283 | } | 290 | } |
284 | 291 | ||
285 | if (vma->vm_flags & VM_LOCKED) { | 292 | if (vma->vm_flags & VM_LOCKED) { |