diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 1cc756eafa44..129bf823e405 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h @@ -554,6 +554,11 @@ static __must_check __always_inline bool user_access_begin(const void __user *pt return 1; } #define user_access_begin(a,b) user_access_begin(a,b) +#define user_access_begin_label(a,b, err_label) \ + ({ \ + asm_volatile_goto("" :::: err_label); \ + user_access_begin(a,b); \ + }) #define user_access_end() __uaccess_end() #define user_access_save() smap_save() diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 3e6c9bcfa612..3309bad69eca 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1709,7 +1709,7 @@ static int copy_compat_iovec_from_user(struct iovec *iov, (const struct compat_iovec __user *)uvec; int ret = -EFAULT, i; - if (!user_access_begin(uiov, nr_segs * sizeof(*uiov))) + if (!user_access_begin_label(uiov, nr_segs * sizeof(*uiov), uaccess_end)) return -EFAULT; for (i = 0; i < nr_segs; i++) {