summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-19 17:36:21 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-25 11:58:52 -0800
commitc4f4b82694fe48b02f7a881a1797131a6dad1364 (patch)
treeae64348930c5aa9512d8d2d342b26bf9a1dc9ced
parent509d0000ca7179fcd797822d15a6fdd4c43bc2ab (diff)
downloadlwn-c4f4b82694fe48b02f7a881a1797131a6dad1364.tar.gz
lwn-c4f4b82694fe48b02f7a881a1797131a6dad1364.zip
AIO: properly check iovec sizes
In Linus's tree, the iovec code has been reworked massively, but in older kernels the AIO layer should be checking this before passing the request on to other layers. Many thanks to Ben Hawkes of Google Project Zero for pointing out the issue. Reported-by: Ben Hawkes <hawkes@google.com> Acked-by: Benjamin LaHaise <bcrl@kvack.org> Tested-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/aio.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 3241659491b1..0612022162ad 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1375,11 +1375,16 @@ static ssize_t aio_setup_single_vector(struct kiocb *kiocb,
unsigned long *nr_segs,
struct iovec *iovec)
{
- if (unlikely(!access_ok(!rw, buf, kiocb->ki_nbytes)))
+ size_t len = kiocb->ki_nbytes;
+
+ if (len > MAX_RW_COUNT)
+ len = MAX_RW_COUNT;
+
+ if (unlikely(!access_ok(!rw, buf, len)))
return -EFAULT;
iovec->iov_base = buf;
- iovec->iov_len = kiocb->ki_nbytes;
+ iovec->iov_len = len;
*nr_segs = 1;
return 0;
}