Commit 690dbe1c authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds

[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: default avatarHugh Dickins <hugh@veritas.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 74f9c9c2
...@@ -910,9 +910,13 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, ...@@ -910,9 +910,13 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
pud = pud_offset(pgd, pg); pud = pud_offset(pgd, pg);
BUG_ON(pud_none(*pud)); BUG_ON(pud_none(*pud));
pmd = pmd_offset(pud, pg); pmd = pmd_offset(pud, pg);
BUG_ON(pmd_none(*pmd)); if (pmd_none(*pmd))
return i ? : -EFAULT;
pte = pte_offset_map(pmd, pg); pte = pte_offset_map(pmd, pg);
BUG_ON(pte_none(*pte)); if (pte_none(*pte)) {
pte_unmap(pte);
return i ? : -EFAULT;
}
if (pages) { if (pages) {
pages[i] = pte_page(*pte); pages[i] = pte_page(*pte);
get_page(pages[i]); get_page(pages[i]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment