Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17d17e72 authored by Al Viro's avatar Al Viro
Browse files

process_vm_access: switch to {compat_,}import_iovec()



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b353a1f7
Loading
Loading
Loading
Loading
+12 −23
Original line number Diff line number Diff line
@@ -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,7 +279,6 @@ 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);

	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,7 +336,6 @@ 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);
	return rc;
}