Re: [RFC 1/4] asm-generic/uaccess: don't define inline functions if noinline lib/* in use

From: Linus Torvalds
Date: Tue Jan 14 2020 - 16:33:13 EST


On Tue, Jan 14, 2020 at 12:09 PM Vineet Gupta
<Vineet.Gupta1@xxxxxxxxxxxx> wrote:
>
> There are 2 generic varaints of strncpy_from_user() / strnlen_user()
> (1). inline version in asm-generic/uaccess.h

I think we should get rid of this entirely. It's just a buggy garbage
implementation that nobody should ever actually use.

It does just about everything wrong that you *can* do, wrong,
including doing the NUL-filling termination of standard strncpy() that
"strncpy_from_user()" doesn't actually do.

So:

- the asm-generic/uaccess.h __strncpy_from_user() function is just
horribly wrong

- the generic/uaccess.h version of strncpy_from_user() shouldn't be
an inline function either, since the only thing it can do inline is
the bogus one-byte access check that _barely_ makes security work (you
also need to have a guard page to _actually_ make it work, and I'm not
atr all convinced that people do).

the whole thing is just broken and should be removed from a header file.

> (2). optimized word-at-a-time version in lib/*

That is - outside of the original x86 strncpy_from_user() - the only
copy of this function that historically gets all the corner cases
right. And even those we've gotten wrong occasionally.

I would suggest that anybody who uses asm-generic/uaccess.h needs to
simply use the generic library version.

Linus