re PR plugins/80094 (GCC plugin hash table corruption on hash table expansion (>10...
authorBrad Spengler <spender@grsecurity.net>
Tue, 21 Mar 2017 11:50:18 +0000 (11:50 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 21 Mar 2017 11:50:18 +0000 (11:50 +0000)
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

gcc/ChangeLog
gcc/plugin.c

index d679a5c014e2672b0bcc741359de958b26bb92cb..225b189d080069dc3aecde3238e8fca01f2f49b2 100644 (file)
@@ -1,3 +1,11 @@
+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>
 
        PR tree-optimization/80032
index 1996c9af43f6a396d462695e52a45802f6767af2..cfd6ef25036915e7b080cb8d4a50c70060c13d75 100644 (file)
@@ -114,6 +114,16 @@ static const char *str_plugin_init_func_name = "plugin_init";
 static const char *str_license = "plugin_is_GPL_compatible";
 #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
    existing entry (S1) with the given string (S2).  */
 
@@ -183,10 +193,11 @@ add_new_plugin (const char* plugin_name)
   /* If this is the first -fplugin= option we encounter, create
      'plugin_name_args_tab' hash table.  */
   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);
 
-  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
      error or a warning message depending on if they have identical full
@@ -273,7 +284,8 @@ parse_plugin_arg_opt (const char *arg)
   /* Check if the named plugin has already been specified earlier in the
      command-line.  */
   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))
     {
       struct plugin_name_args *plugin = (struct plugin_name_args *) *slot;
@@ -329,7 +341,8 @@ parse_plugin_arg_opt (const char *arg)
 static void
 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;
 
   if (slot == NULL)
@@ -635,7 +648,8 @@ init_one_plugin (void **slot, void * ARG_UNUSED (info))
   bool ok = try_init_one_plugin (plugin);
   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);
     }
   return 1;