iov_iter: refactor rw_copy_check_uvector and import_iovec
authorChristoph Hellwig <hch@lst.de>
Fri, 25 Sep 2020 04:51:40 +0000 (06:51 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 3 Oct 2020 04:01:56 +0000 (00:01 -0400)
commitbfdc59701d6d100c99c3b987bcffd1c204e393c8
treea88294580eba288886916d767713789aa06507f2
parentfb041b598997d63c0f7d7305dfae70046bf66fe1
iov_iter: refactor rw_copy_check_uvector and import_iovec

Split rw_copy_check_uvector into two new helpers with more sensible
calling conventions:

 - iovec_from_user copies a iovec from userspace either into the provided
   stack buffer if it fits, or allocates a new buffer for it.  Returns
   the actually used iovec.  It also verifies that iov_len does fit a
   signed type, and handles compat iovecs if the compat flag is set.
 - __import_iovec consolidates the native and compat versions of
   import_iovec. It calls iovec_from_user, then validates each iovec
   actually points to user addresses, and ensures the total length
   doesn't overflow.

This has two major implications:

 - the access_process_vm case loses the total lenght checking, which
   wasn't required anyway, given that each call receives two iovecs
   for the local and remote side of the operation, and it verifies
   the total length on the local side already.
 - instead of a single loop there now are two loops over the iovecs.
   Given that the iovecs are cache hot this doesn't make a major
   difference

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/linux/compat.h
include/linux/fs.h
include/linux/uio.h
lib/iov_iter.c
mm/process_vm_access.c