diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 23:30:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 23:30:19 -0400 |
| commit | 44ccba3f7b230af1bd7ebe173cbf5803df1df486 (patch) | |
| tree | 745b237af595fc6c1b7d3fe1b98c167e0590aa43 /scripts | |
| parent | 21d236bf2bde518844b5675ec4980f4b2fd13e1a (diff) | |
| parent | ad05e6ca7b5fcf15ff178da662035ec7718f938c (diff) | |
Merge tag 'gcc-plugins-v4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull gcc plugins update from Kees Cook:
"This finishes the porting work on randstruct, and introduces a new
option to structleak, both noted below:
- For the randstruct plugin, enable automatic randomization of
structures that are entirely function pointers (along with a couple
designated initializer fixes).
- For the structleak plugin, provide an option to perform zeroing
initialization of all otherwise uninitialized stack variables that
are passed by reference (Ard Biesheuvel)"
* tag 'gcc-plugins-v4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
gcc-plugins: structleak: add option to init all vars used as byref args
randstruct: Enable function pointer struct detection
drivers/net/wan/z85230.c: Use designated initializers
drm/amd/powerplay: rv: Use designated initializers
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/Makefile.gcc-plugins | 1 | ||||
| -rw-r--r-- | scripts/gcc-plugins/randomize_layout_plugin.c | 3 | ||||
| -rw-r--r-- | scripts/gcc-plugins/structleak_plugin.c | 13 |
3 files changed, 12 insertions, 5 deletions
diff --git a/scripts/Makefile.gcc-plugins b/scripts/Makefile.gcc-plugins index 2e0e2eaa397f..d1f7b0d6be66 100644 --- a/scripts/Makefile.gcc-plugins +++ b/scripts/Makefile.gcc-plugins | |||
| @@ -27,6 +27,7 @@ ifdef CONFIG_GCC_PLUGINS | |||
| 27 | 27 | ||
| 28 | gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so | 28 | gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so |
| 29 | gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose | 29 | gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) += -fplugin-arg-structleak_plugin-verbose |
| 30 | gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) += -fplugin-arg-structleak_plugin-byref-all | ||
| 30 | gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN | 31 | gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += -DSTRUCTLEAK_PLUGIN |
| 31 | 32 | ||
| 32 | gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so | 33 | gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so |
diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index cdaac8c66734..0073af326449 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c | |||
| @@ -436,9 +436,6 @@ static int is_pure_ops_struct(const_tree node) | |||
| 436 | 436 | ||
| 437 | gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); | 437 | gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); |
| 438 | 438 | ||
| 439 | /* XXX: Do not apply randomization to all-ftpr structs yet. */ | ||
| 440 | return 0; | ||
| 441 | |||
| 442 | for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) { | 439 | for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) { |
| 443 | const_tree fieldtype = get_field_type(field); | 440 | const_tree fieldtype = get_field_type(field); |
| 444 | enum tree_code code = TREE_CODE(fieldtype); | 441 | enum tree_code code = TREE_CODE(fieldtype); |
diff --git a/scripts/gcc-plugins/structleak_plugin.c b/scripts/gcc-plugins/structleak_plugin.c index fa3d7a4b26f2..3f8dd4868178 100644 --- a/scripts/gcc-plugins/structleak_plugin.c +++ b/scripts/gcc-plugins/structleak_plugin.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | * Options: | 16 | * Options: |
| 17 | * -fplugin-arg-structleak_plugin-disable | 17 | * -fplugin-arg-structleak_plugin-disable |
| 18 | * -fplugin-arg-structleak_plugin-verbose | 18 | * -fplugin-arg-structleak_plugin-verbose |
| 19 | * -fplugin-arg-structleak_plugin-byref-all | ||
| 19 | * | 20 | * |
| 20 | * Usage: | 21 | * Usage: |
| 21 | * $ # for 4.5/4.6/C based 4.7 | 22 | * $ # for 4.5/4.6/C based 4.7 |
| @@ -42,6 +43,7 @@ static struct plugin_info structleak_plugin_info = { | |||
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| 44 | static bool verbose; | 45 | static bool verbose; |
| 46 | static bool byref_all; | ||
| 45 | 47 | ||
| 46 | static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) | 48 | static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) |
| 47 | { | 49 | { |
| @@ -150,7 +152,9 @@ static void initialize(tree var) | |||
| 150 | /* these aren't the 0days you're looking for */ | 152 | /* these aren't the 0days you're looking for */ |
| 151 | if (verbose) | 153 | if (verbose) |
| 152 | inform(DECL_SOURCE_LOCATION(var), | 154 | inform(DECL_SOURCE_LOCATION(var), |
| 153 | "userspace variable will be forcibly initialized"); | 155 | "%s variable will be forcibly initialized", |
| 156 | (byref_all && TREE_ADDRESSABLE(var)) ? "byref" | ||
| 157 | : "userspace"); | ||
| 154 | 158 | ||
| 155 | /* build the initializer expression */ | 159 | /* build the initializer expression */ |
| 156 | initializer = build_constructor(TREE_TYPE(var), NULL); | 160 | initializer = build_constructor(TREE_TYPE(var), NULL); |
| @@ -190,7 +194,8 @@ static unsigned int structleak_execute(void) | |||
| 190 | continue; | 194 | continue; |
| 191 | 195 | ||
| 192 | /* if the type is of interest, examine the variable */ | 196 | /* if the type is of interest, examine the variable */ |
| 193 | if (TYPE_USERSPACE(type)) | 197 | if (TYPE_USERSPACE(type) || |
| 198 | (byref_all && TREE_ADDRESSABLE(var))) | ||
| 194 | initialize(var); | 199 | initialize(var); |
| 195 | } | 200 | } |
| 196 | 201 | ||
| @@ -232,6 +237,10 @@ __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gc | |||
| 232 | verbose = true; | 237 | verbose = true; |
| 233 | continue; | 238 | continue; |
| 234 | } | 239 | } |
| 240 | if (!strcmp(argv[i].key, "byref-all")) { | ||
| 241 | byref_all = true; | ||
| 242 | continue; | ||
| 243 | } | ||
| 235 | error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); | 244 | error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); |
| 236 | } | 245 | } |
| 237 | 246 | ||
