diff options
author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2013-04-08 21:39:22 +0200 |
---|---|---|
committer | Maxime Ripard <maxime.ripard@free-electrons.com> | 2013-04-08 21:39:22 +0200 |
commit | 7c91d302ffe2ffac813c47d6ba2e7489a2ccb35f (patch) | |
tree | 78a2cf601e986694765b28079bf749a8eaa6a2b9 /fs/compat.c | |
parent | 0b824f8dad9fdfc7c1bf9c1d3ac744075eb73ec6 (diff) | |
parent | 918d7f6f68620e0721bb31402ebf87e15f826831 (diff) |
Merge remote-tracking branch 'clk/clk-for-3.10' into sunxi/core-for-3.10
Diffstat (limited to 'fs/compat.c')
-rw-r--r-- | fs/compat.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/compat.c b/fs/compat.c index fe40fde29111..d487985dd0ea 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -558,6 +558,10 @@ ssize_t compat_rw_copy_check_uvector(int type, } *ret_pointer = iov; + ret = -EFAULT; + if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector))) + goto out; + /* * Single unix specification: * We should -EINVAL if an element length is not >= 0 and fitting an @@ -1080,17 +1084,12 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, if (!file->f_op) goto out; - ret = -EFAULT; - if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector))) - goto out; - - tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs, + ret = compat_rw_copy_check_uvector(type, uvector, nr_segs, UIO_FASTIOV, iovstack, &iov); - if (tot_len == 0) { - ret = 0; + if (ret <= 0) goto out; - } + tot_len = ret; ret = rw_verify_area(type, file, pos, tot_len); if (ret < 0) goto out; |