aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse
diff options
context:
space:
mode:
authorZach Brown <zab@redhat.com>2012-07-24 15:10:11 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2012-08-06 12:19:24 -0400
commitfb6ccff667712c46b4501b920ea73a326e49626a (patch)
treef8fa90871e06797a09dd886a2dacf26b199ea667 /fs/fuse
parentf3840dc0fb57aef120c5ee8241cdc9aaf3cec8d4 (diff)
fuse: verify all ioctl retry iov elements
Commit 7572777eef78ebdee1ecb7c258c0ef94d35bad16 attempted to verify that the total iovec from the client doesn't overflow iov_length() but it only checked the first element. The iovec could still overflow by starting with a small element. The obvious fix is to check all the elements. The overflow case doesn't look dangerous to the kernel as the copy is limited by the length after the overflow. This fix restores the intention of returning an error instead of successfully copying less than the iovec represented. I found this by code inspection. I built it but don't have a test case. I'm cc:ing stable because the initial commit did as well. Signed-off-by: Zach Brown <zab@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> CC: <stable@vger.kernel.org> [2.6.37+]
Diffstat (limited to 'fs/fuse')
-rw-r--r--fs/fuse/file.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 5800101e5ce1..2eed3acfb6a6 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1703,7 +1703,7 @@ static int fuse_verify_ioctl_iov(struct iovec *iov, size_t count)
1703 size_t n; 1703 size_t n;
1704 u32 max = FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT; 1704 u32 max = FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT;
1705 1705
1706 for (n = 0; n < count; n++) { 1706 for (n = 0; n < count; n++, iov++) {
1707 if (iov->iov_len > (size_t) max) 1707 if (iov->iov_len > (size_t) max)
1708 return -ENOMEM; 1708 return -ENOMEM;
1709 max -= iov->iov_len; 1709 max -= iov->iov_len;