Re: [PATCH] futex: use fault_in to avoid infinite loop

From: Peter Zijlstra
Date: Fri Dec 08 2017 - 05:50:22 EST


On Thu, Dec 07, 2017 at 09:21:36PM -0800, Darren Hart wrote:
> On Wed, Dec 06, 2017 at 10:40:08PM +0100, Peter Zijlstra wrote:
> > diff --git a/include/uapi/asm-generic/errno.h b/include/uapi/asm-generic/errno.h
> > index cf9c51ac49f9..4cb80d4ac160 100644
> > --- a/include/uapi/asm-generic/errno.h
> > +++ b/include/uapi/asm-generic/errno.h
> > @@ -119,5 +119,6 @@
> > #define ERFKILL 132 /* Operation not possible due to RF-kill */
> >
> > #define EHWPOISON 133 /* Memory page has hardware error */
> > +#define EMORON 134 /* User did something particularly silly */
>
> It's baaa-aaack...
>

Had to try... will keep trying, we need this! :-)

> > --- a/kernel/futex.c
> > +++ b/kernel/futex.c
> > @@ -3262,6 +3262,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
> > SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head,
> > size_t, len)
> > {
> > + unsigned long address = (unsigned long)head;
> > +
> > if (!futex_cmpxchg_enabled)
> > return -ENOSYS;
> > /*
> > @@ -3270,6 +3272,9 @@ SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head,
> > if (unlikely(len != sizeof(*head)))
> > return -EINVAL;
> >
> > + if (unlikely(address % __alignof__(*head)))
> > + return -EMORON;
>
> Seeing as how this is performing the test as early as possible, would it make
> sense to also catch unaligned uaddr and uaddr2 as early as possible too - in
> sys_futex?

Probably makes it clearer that we have this requirement, yes.