On Fri, Mar 26, 2021 at 03:38:30PM +0100, Christoph Hellwig wrote:

> -static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr)
> +static const char __user *
> +get_user_arg_ptr(const char __user *const __user *argv, int nr)
>  {
> -     const char __user *native;
> -
> -#ifdef CONFIG_COMPAT
> -     if (unlikely(argv.is_compat)) {
> +     if (in_compat_syscall()) {
> +             const compat_uptr_t __user *compat_argv =
> +                     compat_ptr((unsigned long)argv);
>               compat_uptr_t compat;
>  
> -             if (get_user(compat, argv.ptr.compat + nr))
> +             if (get_user(compat, compat_argv + nr))
>                       return ERR_PTR(-EFAULT);
> -
>               return compat_ptr(compat);
> -     }
> -#endif
> -
> -     if (get_user(native, argv.ptr.native + nr))
> -             return ERR_PTR(-EFAULT);
> +     } else {
> +             const char __user *native;
>  
> -     return native;
> +             if (get_user(native, argv + nr))
> +                     return ERR_PTR(-EFAULT);
> +             return native;
> +     }
>  }

Yecchhh....  So you have in_compat_syscall() called again and again, for
each argument in the list?  I agree that current version is fucking ugly,
but I really hate that approach ;-/

Reply via email to