Commit aead196b authored by Linus Torvalds's avatar Linus Torvalds Committed by Greg Kroah-Hartman

Remove broken ptrace() special-case code from file mapping

The kernel has for random historical reasons allowed ptrace() accesses
to access (and insert) pages into the page cache above the size of the
file.

However, Nick broke that by mistake when doing the new fault handling in
commit 54cb8821 ("mm: merge populate and
nopage into fault (fixes nonlinear)".  The breakage caused a hang with
gdb when trying to access the invalid page.

The ptrace "feature" really isn't worth resurrecting, since it really is
wrong both from a portability _and_ from an internal page cache validity
standpoint.  So this removes those old broken remnants, and fixes the
ptrace() hang in the process.

Noticed and bisected by Duane Griffin, who also supplied a test-case
(quoth Nick: "Well that's probably the best bug report I've ever had,
thanks Duane!").

Cc: Duane Griffin <duaneg@dghda.com>
Acked-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f153577e
...@@ -1312,7 +1312,7 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ...@@ -1312,7 +1312,7 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
if (vmf->pgoff >= size) if (vmf->pgoff >= size)
goto outside_data_content; return VM_FAULT_SIGBUS;
/* If we don't want any read-ahead, don't bother */ /* If we don't want any read-ahead, don't bother */
if (VM_RandomReadHint(vma)) if (VM_RandomReadHint(vma))
...@@ -1389,7 +1389,7 @@ retry_find: ...@@ -1389,7 +1389,7 @@ retry_find:
if (unlikely(vmf->pgoff >= size)) { if (unlikely(vmf->pgoff >= size)) {
unlock_page(page); unlock_page(page);
page_cache_release(page); page_cache_release(page);
goto outside_data_content; return VM_FAULT_SIGBUS;
} }
/* /*
...@@ -1400,15 +1400,6 @@ retry_find: ...@@ -1400,15 +1400,6 @@ retry_find:
vmf->page = page; vmf->page = page;
return ret | VM_FAULT_LOCKED; return ret | VM_FAULT_LOCKED;
outside_data_content:
/*
* An external ptracer can access pages that normally aren't
* accessible..
*/
if (vma->vm_mm == current->mm)
return VM_FAULT_SIGBUS;
/* Fall through to the non-read-ahead case */
no_cached_page: no_cached_page:
/* /*
* We're only likely to ever get here if MADV_RANDOM is in * We're only likely to ever get here if MADV_RANDOM is in
......
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