Re: PROBLEM: fanotify_mark EFAULT on x86

From: Jan Kara
Date: Wed Nov 04 2020 - 05:14:52 EST


On Tue 03-11-20 22:17:47, Paweł Jasiak wrote:
> I have written small patch that fixes problem for me and doesn't break
> x86_64.

Yeah, that looks sensible, thanks for the patch. But I'm waiting for some
explanation from x86 folks when compat handlers are really needed and why
it wasn't needed before syscall wrapper rewrite in 5.7-rc1 and is needed
now. Brian, Andy, Thomas?

Honza

>
> diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
> index 3e01d8f2ab90..cf0b97309975 100644
> --- a/fs/notify/fanotify/fanotify_user.c
> +++ b/fs/notify/fanotify/fanotify_user.c
> @@ -1285,12 +1285,27 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
> return ret;
> }
>
> +#if defined(CONFIG_X86) && !defined(CONFIG_64BIT)
> +SYSCALL_DEFINE6(fanotify_mark,
> + int, fanotify_fd, unsigned int, flags, __u32, mask0,
> + __u32, mask1, int, dfd, const char __user *, pathname)
> +{
> + return do_fanotify_mark(fanotify_fd, flags,
> +#ifdef __BIG_ENDIAN
> + ((__u64)mask0 << 32) | mask1,
> +#else
> + ((__u64)mask1 << 32) | mask0,
> +#endif
> + dfd, pathname);
> +}
> +#else
> SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
> __u64, mask, int, dfd,
> const char __user *, pathname)
> {
> return do_fanotify_mark(fanotify_fd, flags, mask, dfd, pathname);
> }
> +#endif
>
> #ifdef CONFIG_COMPAT
> COMPAT_SYSCALL_DEFINE6(fanotify_mark,
>
>
> --
>
> Paweł Jasiak
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR