|
@@ -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;
|