Commit 1689c73a authored by Al Viro's avatar Al Viro Committed by Linus Torvalds

Fix off-by-one in __pipe_get_pages()

it actually worked only when requested area ended on the page boundary...
Reported-by: default avatarMarco Grassi <marco.gra@gmail.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6b5e09a7
...@@ -833,13 +833,13 @@ static inline size_t __pipe_get_pages(struct iov_iter *i, ...@@ -833,13 +833,13 @@ static inline size_t __pipe_get_pages(struct iov_iter *i,
size_t *start) size_t *start)
{ {
struct pipe_inode_info *pipe = i->pipe; struct pipe_inode_info *pipe = i->pipe;
size_t n = push_pipe(i, maxsize, &idx, start); ssize_t n = push_pipe(i, maxsize, &idx, start);
if (!n) if (!n)
return -EFAULT; return -EFAULT;
maxsize = n; maxsize = n;
n += *start; n += *start;
while (n >= PAGE_SIZE) { while (n > 0) {
get_page(*pages++ = pipe->bufs[idx].page); get_page(*pages++ = pipe->bufs[idx].page);
idx = next_idx(idx, pipe); idx = next_idx(idx, pipe);
n -= PAGE_SIZE; n -= PAGE_SIZE;
......
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