On Tue, Apr 16, 2019 at 10:19:42PM +0200, Arnd Bergmann wrote:
> +#ifdef CONFIG_COMPAT
> +struct ppp_option_data32 {
> +     compat_caddr_t  ptr;

Huh?  compat_uptr_t, surely?  I realize that compat_ioctl.c is bogus
that way right now, but let's not spread that crap into the places
where it's harder to find...

>       err = -EFAULT;
> -     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
> -             goto out;
> +#ifdef CONFIG_COMPAT
> +     if (compat) {
> +             struct ppp_option_data32 data32;
> +
> +             if (copy_from_user(&data32, (void __user *) arg,
> +                                sizeof(data32)))
> +                     goto out;
> +
> +             data.ptr = compat_ptr(data32.ptr);
> +             data.length = data32.length;
> +             data.transmit = data32.transmit;
> +     } else
> +#endif
> +     {
> +             if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
> +                     goto out;
> +     }

*UGH*

Do that in caller, please.  And sod the flag argument...

Reply via email to