X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=mm%2Ffilemap.c;h=2f7b7783bd6b207da7c39778a43654f76f6d93b8;hb=daba2b314a43c53be61eb98e0e88b094398196f5;hp=68f1813fbdc30127bac0d5eb918dc8e2a412813b;hpb=d880e5ad0df3c2e1d69bb356737a46abb5087d42;p=cascardo%2Flinux.git diff --git a/mm/filemap.c b/mm/filemap.c index 68f1813fbdc3..2f7b7783bd6b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1687,6 +1687,10 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos, unsigned int prev_offset; int error = 0; + if (unlikely(*ppos >= inode->i_sb->s_maxbytes)) + return -EINVAL; + iov_iter_truncate(iter, inode->i_sb->s_maxbytes); + index = *ppos >> PAGE_SHIFT; prev_index = ra->prev_pos >> PAGE_SHIFT; prev_offset = ra->prev_pos & (PAGE_SIZE-1); @@ -1721,7 +1725,9 @@ find_page: * wait_on_page_locked is used to avoid unnecessarily * serialisations and why it's safe. */ - wait_on_page_locked_killable(page); + error = wait_on_page_locked_killable(page); + if (unlikely(error)) + goto readpage_error; if (PageUptodate(page)) goto page_ok;