diff options
Diffstat (limited to 'lib/iov_iter.c')
| -rw-r--r-- | lib/iov_iter.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/iov_iter.c b/lib/iov_iter.c index f9a3ff37ecd1..d9b3332c8405 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1877,6 +1877,17 @@ int import_single_range(int rw, void __user *buf, size_t len,  }  EXPORT_SYMBOL(import_single_range); +int import_ubuf(int rw, void __user *buf, size_t len, struct iov_iter *i) +{ +	if (len > MAX_RW_COUNT) +		len = MAX_RW_COUNT; +	if (unlikely(!access_ok(buf, len))) +		return -EFAULT; + +	iov_iter_ubuf(i, rw, buf, len); +	return 0; +} +  /**   * iov_iter_restore() - Restore a &struct iov_iter to the same state as when   *     iov_iter_save_state() was called. @@ -1891,8 +1902,8 @@ EXPORT_SYMBOL(import_single_range);   */  void iov_iter_restore(struct iov_iter *i, struct iov_iter_state *state)  { -	if (WARN_ON_ONCE(!iov_iter_is_bvec(i) && !iter_is_iovec(i)) && -			 !iov_iter_is_kvec(i) && !iter_is_ubuf(i)) +	if (WARN_ON_ONCE(!iov_iter_is_bvec(i) && !iter_is_iovec(i) && +			 !iter_is_ubuf(i)) && !iov_iter_is_kvec(i))  		return;  	i->iov_offset = state->iov_offset;  	i->count = state->count;  |