summaryrefslogtreecommitdiff
path: root/fs/nfs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2012-12-12 11:38:44 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-11 09:18:36 -0800
commit9883793305d5fbcf79c565f3572ba44d2493f8f5 (patch)
treeca0e4a6619a6e448462a409657e90852b44d4b47 /fs/nfs
parent43d1640924a2bd61e5f8ad156930353bd410e36d (diff)
downloadlwn-9883793305d5fbcf79c565f3572ba44d2493f8f5.tar.gz
lwn-9883793305d5fbcf79c565f3572ba44d2493f8f5.zip
nfs: don't zero out the rest of the page if we hit the EOF on a DIO READ
commit 67fad106a219e083c91c79695bd1807dde1bf7b9 upstream. Eryu provided a test program that would segfault when attempting to read past the EOF on file that was opened O_DIRECT. The buffer given to the read() call was on the stack, and when he attempted to read past it it would scribble over the rest of the stack page. If we hit the end of the file on a DIO READ request, then we don't want to zero out the rest of the buffer. These aren't pagecache pages after all, and there's no guarantee that the buffers that were passed in represent entire pages. Reported-by: Eryu Guan <eguan@redhat.com> Cc: Fred Isaman <iisaman@netapp.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/direct.c8
1 files changed, 0 insertions, 8 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index cae26cbd59ee..594f4e7e0b9a 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -266,14 +266,6 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
struct nfs_page *req = nfs_list_entry(hdr->pages.next);
struct page *page = req->wb_page;
- if (test_bit(NFS_IOHDR_EOF, &hdr->flags)) {
- if (bytes > hdr->good_bytes)
- zero_user(page, 0, PAGE_SIZE);
- else if (hdr->good_bytes - bytes < PAGE_SIZE)
- zero_user_segment(page,
- hdr->good_bytes & ~PAGE_MASK,
- PAGE_SIZE);
- }
if (!PageCompound(page)) {
if (test_bit(NFS_IOHDR_ERROR, &hdr->flags)) {
if (bytes < hdr->good_bytes)