| From 2cfe0d3009418a132b93d78642a8059a38fe5944 Mon Sep 17 00:00:00 2001 |
| From: Kees Cook <keescook@chromium.org> |
| Date: Tue, 10 Apr 2018 16:32:44 -0700 |
| Subject: task_struct: only use anon struct under randstruct plugin |
| |
| From: Kees Cook <keescook@chromium.org> |
| |
| commit 2cfe0d3009418a132b93d78642a8059a38fe5944 upstream. |
| |
| The original intent for always adding the anonymous struct in |
| task_struct was to make sure we had compiler coverage. |
| |
| However, this caused pathological padding of 40 bytes at the start of |
| task_struct. Instead, move the anonymous struct to being only used when |
| struct layout randomization is enabled. |
| |
| Link: http://lkml.kernel.org/r/20180327213609.GA2964@beast |
| Fixes: 29e48ce87f1e ("task_struct: Allow randomized") |
| Signed-off-by: Kees Cook <keescook@chromium.org> |
| Reported-by: Peter Zijlstra <peterz@infradead.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/compiler-clang.h | 3 --- |
| include/linux/compiler-gcc.h | 12 +++--------- |
| 2 files changed, 3 insertions(+), 12 deletions(-) |
| |
| --- a/include/linux/compiler-clang.h |
| +++ b/include/linux/compiler-clang.h |
| @@ -17,9 +17,6 @@ |
| */ |
| #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) |
| |
| -#define randomized_struct_fields_start struct { |
| -#define randomized_struct_fields_end }; |
| - |
| /* all clang versions usable with the kernel support KASAN ABI version 5 */ |
| #define KASAN_ABI_VERSION 5 |
| |
| --- a/include/linux/compiler-gcc.h |
| +++ b/include/linux/compiler-gcc.h |
| @@ -242,6 +242,9 @@ |
| #if defined(RANDSTRUCT_PLUGIN) && !defined(__CHECKER__) |
| #define __randomize_layout __attribute__((randomize_layout)) |
| #define __no_randomize_layout __attribute__((no_randomize_layout)) |
| +/* This anon struct can add padding, so only enable it under randstruct. */ |
| +#define randomized_struct_fields_start struct { |
| +#define randomized_struct_fields_end } __randomize_layout; |
| #endif |
| |
| #endif /* GCC_VERSION >= 40500 */ |
| @@ -256,15 +259,6 @@ |
| */ |
| #define __visible __attribute__((externally_visible)) |
| |
| -/* |
| - * RANDSTRUCT_PLUGIN wants to use an anonymous struct, but it is only |
| - * possible since GCC 4.6. To provide as much build testing coverage |
| - * as possible, this is used for all GCC 4.6+ builds, and not just on |
| - * RANDSTRUCT_PLUGIN builds. |
| - */ |
| -#define randomized_struct_fields_start struct { |
| -#define randomized_struct_fields_end } __randomize_layout; |
| - |
| #endif /* GCC_VERSION >= 40600 */ |
| |
| |