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) { |
