diff options
-rw-r--r-- | arch/arm/kernel/traps.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 4d268d912b0e..9b2c5d42c143 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -550,24 +550,11 @@ static long do_cache_op_restart(struct restart_block *unused) | |||
550 | static inline int | 550 | static inline int |
551 | do_cache_op(unsigned long start, unsigned long end, int flags) | 551 | do_cache_op(unsigned long start, unsigned long end, int flags) |
552 | { | 552 | { |
553 | struct mm_struct *mm = current->active_mm; | ||
554 | struct vm_area_struct *vma; | ||
555 | |||
556 | if (end < start || flags) | 553 | if (end < start || flags) |
557 | return -EINVAL; | 554 | return -EINVAL; |
558 | 555 | ||
559 | down_read(&mm->mmap_sem); | 556 | if (!access_ok(VERIFY_READ, start, end - start)) |
560 | vma = find_vma(mm, start); | 557 | return -EFAULT; |
561 | if (!vma || vma->vm_start >= end) { | ||
562 | up_read(&mm->mmap_sem); | ||
563 | return -EINVAL; | ||
564 | } | ||
565 | |||
566 | if (start < vma->vm_start) | ||
567 | start = vma->vm_start; | ||
568 | if (end > vma->vm_end) | ||
569 | end = vma->vm_end; | ||
570 | up_read(&mm->mmap_sem); | ||
571 | 558 | ||
572 | return __do_cache_op(start, end); | 559 | return __do_cache_op(start, end); |
573 | } | 560 | } |