process_vm_access: switch to {compat_,}import_iovec()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 21 Mar 2015 18:47:11 +0000 (14:47 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 12 Apr 2015 02:27:12 +0000 (22:27 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
mm/process_vm_access.c

index b159769..e88d071 100644 (file)
@@ -257,22 +257,18 @@ static ssize_t process_vm_rw(pid_t pid,
        struct iovec *iov_r = iovstack_r;
        struct iov_iter iter;
        ssize_t rc;
+       int dir = vm_write ? WRITE : READ;
 
        if (flags != 0)
                return -EINVAL;
 
        /* Check iovecs */
-       if (vm_write)
-               rc = rw_copy_check_uvector(WRITE, lvec, liovcnt, UIO_FASTIOV,
-                                          iovstack_l, &iov_l);
-       else
-               rc = rw_copy_check_uvector(READ, lvec, liovcnt, UIO_FASTIOV,
-                                          iovstack_l, &iov_l);
-       if (rc <= 0)
+       rc = import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter);
+       if (rc < 0)
+               return rc;
+       if (!iov_iter_count(&iter))
                goto free_iovecs;
 
-       iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc);
-
        rc = rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt, UIO_FASTIOV,
                                   iovstack_r, &iov_r);
        if (rc <= 0)
@@ -283,8 +279,7 @@ static ssize_t process_vm_rw(pid_t pid,
 free_iovecs:
        if (iov_r != iovstack_r)
                kfree(iov_r);
-       if (iov_l != iovstack_l)
-               kfree(iov_l);
+       kfree(iov_l);
 
        return rc;
 }
@@ -320,21 +315,16 @@ compat_process_vm_rw(compat_pid_t pid,
        struct iovec *iov_r = iovstack_r;
        struct iov_iter iter;
        ssize_t rc = -EFAULT;
+       int dir = vm_write ? WRITE : READ;
 
        if (flags != 0)
                return -EINVAL;
 
-       if (vm_write)
-               rc = compat_rw_copy_check_uvector(WRITE, lvec, liovcnt,
-                                                 UIO_FASTIOV, iovstack_l,
-                                                 &iov_l);
-       else
-               rc = compat_rw_copy_check_uvector(READ, lvec, liovcnt,
-                                                 UIO_FASTIOV, iovstack_l,
-                                                 &iov_l);
-       if (rc <= 0)
+       rc = compat_import_iovec(dir, lvec, liovcnt, UIO_FASTIOV, &iov_l, &iter);
+       if (rc < 0)
+               return rc;
+       if (!iov_iter_count(&iter))
                goto free_iovecs;
-       iov_iter_init(&iter, vm_write ? WRITE : READ, iov_l, liovcnt, rc);
        rc = compat_rw_copy_check_uvector(CHECK_IOVEC_ONLY, rvec, riovcnt,
                                          UIO_FASTIOV, iovstack_r,
                                          &iov_r);
@@ -346,8 +336,7 @@ compat_process_vm_rw(compat_pid_t pid,
 free_iovecs:
        if (iov_r != iovstack_r)
                kfree(iov_r);
-       if (iov_l != iovstack_l)
-               kfree(iov_l);
+       kfree(iov_l);
        return rc;
 }