mm/filemap: fix infinite loop in generic_file_buffered_read()
Subsystems (2)
PATCH 1/1 mm/filemap: fix infinite loop in generic_file_buffered_read()
From: Kent Overstreet <[email protected]>
commit 3644e2d2dda78e21edd8f5415b6d7ab03f5f54f3 upstream.
If iter->count is 0 and iocb->ki_pos is page aligned, this causes nr_pages to be 0.
Then in generic_file_buffered_read_get_pages() find_get_pages_contig() returns 0 - because we asked for 0 pages, so we call generic_file_buffered_read_no_cached_page() which attempts to add a page to the page cache, which fails with -EEXIST, and then we loop. Oops...
Signed-off-by Kent Overstreet <[email protected]>
Reported-by Jens Axboe <[email protected]>
Reviewed-by Jens Axboe <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
Signed-off-by Suraj Jitindar Singh <[email protected]>
--- mm/filemap.c | 3 +++ 1 file changed, 3 insertions(+)
mm/filemap.c +3 -0
@@ -2203,6 +2203,9 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,if (unlikely (*ppos >= inode->i_sb->s_maxbytes))return 0 ; +if (unlikely (!iov_iter_count (iter))) +return 0 ; +iov_iter_truncate (iter, inode->i_sb->s_maxbytes); index = *ppos >>PAGE_SHIFT ;
Signature · 1 line
2.34.1