aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2010-10-26 17:22:07 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-26 19:52:11 -0400
commit70384dc6dcc6aa76762200262820bdb8b724ecd5 (patch)
tree2a1692b185b2bbb9dc3890cdb897ef2a0d375c15
parent66d7dd518ae413a383ab2c6c263cc30617329842 (diff)
mm: fix error reporting in move_pages() syscall
The vma returned by find_vma does not necessarily include the target address. If this happens the code tries to follow a page outside of any vma and returns ENOENT instead of EFAULT. Signed-off-by: Gleb Natapov <gleb@redhat.com> Acked-by: Christoph Lameter <cl@linux-foundation.org> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/migrate.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 35e454189966..fe5a3c6a5426 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1037,7 +1037,7 @@ static int do_move_page_to_node_array(struct mm_struct *mm,
1037 1037
1038 err = -EFAULT; 1038 err = -EFAULT;
1039 vma = find_vma(mm, pp->addr); 1039 vma = find_vma(mm, pp->addr);
1040 if (!vma || !vma_migratable(vma)) 1040 if (!vma || pp->addr < vma->vm_start || !vma_migratable(vma))
1041 goto set_status; 1041 goto set_status;
1042 1042
1043 page = follow_page(vma, pp->addr, FOLL_GET); 1043 page = follow_page(vma, pp->addr, FOLL_GET);
@@ -1204,7 +1204,7 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
1204 int err = -EFAULT; 1204 int err = -EFAULT;
1205 1205
1206 vma = find_vma(mm, addr); 1206 vma = find_vma(mm, addr);
1207 if (!vma) 1207 if (!vma || addr < vma->vm_start)
1208 goto set_status; 1208 goto set_status;
1209 1209
1210 page = follow_page(vma, addr, 0); 1210 page = follow_page(vma, addr, 0);