Commit d5498d2f by Brad Spengler Committed by Richard Biener

re PR plugins/80094 (GCC plugin hash table corruption on hash table expansion…

re PR plugins/80094 (GCC plugin hash table corruption on hash table expansion (>10 plugins) on GCC 4.5+)

2017-03-21  Brad Spengler <spender@grsecurity.net>

	PR plugins/80094
	* plugin.c (htab_hash_plugin): New function.
	(add_new_plugin): Use it and adjust.
	(parse_plugin_arg_opt): Adjust.
	(init_one_plugin): Likewise.

From-SVN: r246315
parent e650ea2a
2017-03-21 Brad Spengler <spender@grsecurity.net>
PR plugins/80094
* plugin.c (htab_hash_plugin): New function.
(add_new_plugin): Use it and adjust.
(parse_plugin_arg_opt): Adjust.
(init_one_plugin): Likewise.
2017-03-21 Richard Biener <rguenther@suse.de> 2017-03-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/80032 PR tree-optimization/80032
......
...@@ -114,6 +114,16 @@ static const char *str_plugin_init_func_name = "plugin_init"; ...@@ -114,6 +114,16 @@ static const char *str_plugin_init_func_name = "plugin_init";
static const char *str_license = "plugin_is_GPL_compatible"; static const char *str_license = "plugin_is_GPL_compatible";
#endif #endif
/* Helper function for hashing the base_name of the plugin_name_args
structure to be inserted into the hash table. */
static hashval_t
htab_hash_plugin (const PTR p)
{
const struct plugin_name_args *plugin = (const struct plugin_name_args *) p;
return htab_hash_string (plugin->base_name);
}
/* Helper function for the hash table that compares the base_name of the /* Helper function for the hash table that compares the base_name of the
existing entry (S1) with the given string (S2). */ existing entry (S1) with the given string (S2). */
...@@ -183,10 +193,11 @@ add_new_plugin (const char* plugin_name) ...@@ -183,10 +193,11 @@ add_new_plugin (const char* plugin_name)
/* If this is the first -fplugin= option we encounter, create /* If this is the first -fplugin= option we encounter, create
'plugin_name_args_tab' hash table. */ 'plugin_name_args_tab' hash table. */
if (!plugin_name_args_tab) if (!plugin_name_args_tab)
plugin_name_args_tab = htab_create (10, htab_hash_string, htab_str_eq, plugin_name_args_tab = htab_create (10, htab_hash_plugin, htab_str_eq,
NULL); NULL);
slot = htab_find_slot (plugin_name_args_tab, base_name, INSERT); slot = htab_find_slot_with_hash (plugin_name_args_tab, base_name,
htab_hash_string (base_name), INSERT);
/* If the same plugin (name) has been specified earlier, either emit an /* If the same plugin (name) has been specified earlier, either emit an
error or a warning message depending on if they have identical full error or a warning message depending on if they have identical full
...@@ -273,7 +284,8 @@ parse_plugin_arg_opt (const char *arg) ...@@ -273,7 +284,8 @@ parse_plugin_arg_opt (const char *arg)
/* Check if the named plugin has already been specified earlier in the /* Check if the named plugin has already been specified earlier in the
command-line. */ command-line. */
if (plugin_name_args_tab if (plugin_name_args_tab
&& ((slot = htab_find_slot (plugin_name_args_tab, name, NO_INSERT)) && ((slot = htab_find_slot_with_hash (plugin_name_args_tab, name,
htab_hash_string (name), NO_INSERT))
!= NULL)) != NULL))
{ {
struct plugin_name_args *plugin = (struct plugin_name_args *) *slot; struct plugin_name_args *plugin = (struct plugin_name_args *) *slot;
...@@ -329,7 +341,8 @@ parse_plugin_arg_opt (const char *arg) ...@@ -329,7 +341,8 @@ parse_plugin_arg_opt (const char *arg)
static void static void
register_plugin_info (const char* name, struct plugin_info *info) register_plugin_info (const char* name, struct plugin_info *info)
{ {
void **slot = htab_find_slot (plugin_name_args_tab, name, NO_INSERT); void **slot = htab_find_slot_with_hash (plugin_name_args_tab, name,
htab_hash_string (name), NO_INSERT);
struct plugin_name_args *plugin; struct plugin_name_args *plugin;
if (slot == NULL) if (slot == NULL)
...@@ -635,7 +648,8 @@ init_one_plugin (void **slot, void * ARG_UNUSED (info)) ...@@ -635,7 +648,8 @@ init_one_plugin (void **slot, void * ARG_UNUSED (info))
bool ok = try_init_one_plugin (plugin); bool ok = try_init_one_plugin (plugin);
if (!ok) if (!ok)
{ {
htab_remove_elt (plugin_name_args_tab, plugin->base_name); htab_remove_elt_with_hash (plugin_name_args_tab, plugin->base_name,
htab_hash_string (plugin->base_name));
XDELETE (plugin); XDELETE (plugin);
} }
return 1; return 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment