forked from Minki/linux
[PATCH] x86_64: access of some bad address
x86_64 has a large sparse gate area between VSYSCALL_START and VSYSCALL_END, not all of it presently backed by pmds. Alexander Nyberg has found that in some circumstances gdb may try to ptrace here, and hit get_user_pages BUG_ON. It seems odd that gdb should be accessing here, but it certainly shouldn't crash in this way: relax BUG_ON to -EFAULT. Fixes kernel bugzilla #4801. Signed-off-by: Hugh Dickins <hugh@veritas.com> Cc: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
74f9c9c258
commit
690dbe1ced
@ -910,9 +910,13 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
|
||||
pud = pud_offset(pgd, pg);
|
||||
BUG_ON(pud_none(*pud));
|
||||
pmd = pmd_offset(pud, pg);
|
||||
BUG_ON(pmd_none(*pmd));
|
||||
if (pmd_none(*pmd))
|
||||
return i ? : -EFAULT;
|
||||
pte = pte_offset_map(pmd, pg);
|
||||
BUG_ON(pte_none(*pte));
|
||||
if (pte_none(*pte)) {
|
||||
pte_unmap(pte);
|
||||
return i ? : -EFAULT;
|
||||
}
|
||||
if (pages) {
|
||||
pages[i] = pte_page(*pte);
|
||||
get_page(pages[i]);
|
||||
|
Loading…
Reference in New Issue
Block a user