aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-31 12:19:46 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-31 12:19:46 -0400
commit5307cc1aa53850f017c8053db034cf950b670ac9 (patch)
tree6fd2ff3fe382ba1aac5e8b6c703268200a80ed40
parentbb374b7b938f73666c403b201b3dd48ec9fe118a (diff)
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 54cb8821de07f2ffcd28c380ce9b93d5784b40d7 ("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: Nick Piggin <npiggin@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/filemap.c13
1 files changed, 2 insertions, 11 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index 9940895f734c..188cf5fd3e8d 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1300,7 +1300,7 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1300 1300
1301 size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 1301 size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
1302 if (vmf->pgoff >= size) 1302 if (vmf->pgoff >= size)
1303 goto outside_data_content; 1303 return VM_FAULT_SIGBUS;
1304 1304
1305 /* If we don't want any read-ahead, don't bother */ 1305 /* If we don't want any read-ahead, don't bother */
1306 if (VM_RandomReadHint(vma)) 1306 if (VM_RandomReadHint(vma))
@@ -1377,7 +1377,7 @@ retry_find:
1377 if (unlikely(vmf->pgoff >= size)) { 1377 if (unlikely(vmf->pgoff >= size)) {
1378 unlock_page(page); 1378 unlock_page(page);
1379 page_cache_release(page); 1379 page_cache_release(page);
1380 goto outside_data_content; 1380 return VM_FAULT_SIGBUS;
1381 } 1381 }
1382 1382
1383 /* 1383 /*
@@ -1388,15 +1388,6 @@ retry_find:
1388 vmf->page = page; 1388 vmf->page = page;
1389 return ret | VM_FAULT_LOCKED; 1389 return ret | VM_FAULT_LOCKED;
1390 1390
1391outside_data_content:
1392 /*
1393 * An external ptracer can access pages that normally aren't
1394 * accessible..
1395 */
1396 if (vma->vm_mm == current->mm)
1397 return VM_FAULT_SIGBUS;
1398
1399 /* Fall through to the non-read-ahead case */
1400no_cached_page: 1391no_cached_page:
1401 /* 1392 /*
1402 * We're only likely to ever get here if MADV_RANDOM is in 1393 * We're only likely to ever get here if MADV_RANDOM is in