diff options
| author | Kees Cook <keescook@chromium.org> | 2017-08-07 16:29:04 -0400 |
|---|---|---|
| committer | Kees Cook <keescook@chromium.org> | 2017-08-07 16:29:04 -0400 |
| commit | ad05e6ca7b5fcf15ff178da662035ec7718f938c (patch) | |
| tree | f4857cd9389a826a2c56a73b798cbe1bb269b81b /scripts | |
| parent | 9225331b310821760f39ba55b00b8973602adbb5 (diff) | |
| parent | f7dd2507893cc3425d3ffc2369559619960befb0 (diff) | |
Merge branch 'for-next/gcc-plugin/structleak' into for-next/gcc-plugins
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/Makefile.gcc-plugins | 1 | ||||
| -rw-r--r-- | scripts/gcc-plugins/structleak_plugin.c | 13 |
2 files changed, 12 insertions, 2 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/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 | ||
