Messages in this thread | | | Date | Mon, 28 Oct 2019 11:58:34 -0700 | From | Kees Cook <> | Subject | Re: [PATCH] kernel: sys.c: Avoid copying possible padding bytes in copy_to_user |
| |
On Sun, Oct 27, 2019 at 03:47:21PM -0700, Joe Perches wrote: > I think yes as at least it makes it consistent. > > From the link above, as I understand the __user > gcc extension here > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c61f13eaa1ee17728c41370100d2d45c254ce76f > > gcc does not clear padding from initialized structs > marked with __user.
It seems to depend on how complete the initialization is and/or how large the structure is. AFAICT, based on the tests I wrote[1], if CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF (or ..._ALL) are used, even padding will get initialized as long as things are in memory. (And the same is true with Clang under CONFIG_INIT_STACK_ALL.)
> Though that doesn't force the compiler to not > perform the possible register optimization shown > in the first document above.
Right. This is the only case where things aren't clear. I haven't been able to build a test where "store in registers" behavior is tripped.
-Kees
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/test_stackinit.c
-- Kees Cook
| |