[PATCH] Fix crash when ptrace poking hugepage areas

set_page_dirty() will not cope with being handed a page * which is part of
a compound page, but not the master page in that compound page. This case
can occur via access_process_vm() if you attemp to write to another
process's hugepage memory area using ptrace() (causing an oops or hang).

This patch fixes the bug by only calling set_page_dirty() from
access_process_vm() if the page is not a compound page. We already use a
similar fix in bio_set_pages_dirty() for the case of direct io to
hugepages.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: William Irwin <wli@holomorphy.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by David Gibson and committed by Linus Torvalds 5bd0190b df69a60d

+2 -1
+2 -1
kernel/ptrace.c
··· 241 241 if (write) { 242 242 copy_to_user_page(vma, page, addr, 243 243 maddr + offset, buf, bytes); 244 - set_page_dirty_lock(page); 244 + if (!PageCompound(page)) 245 + set_page_dirty_lock(page); 245 246 } else { 246 247 copy_from_user_page(vma, page, addr, 247 248 buf, maddr + offset, bytes);