PR29170, divide by zero displaying fuzzed .debug_names
authorAlan Modra <amodra@gmail.com>
Tue, 24 May 2022 00:52:50 +0000 (10:22 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 24 May 2022 01:22:05 +0000 (10:52 +0930)
PR 29170
* dwarf.c (display_debug_names): Don't attempt to display bucket
clashes when bucket count is zero.

binutils/dwarf.c

index c855972a12f903679970a2398f84f6075f8eb751..d820c21527f4b8d8e71ef0592485b1c19e656297 100644 (file)
@@ -10149,32 +10149,35 @@ display_debug_names (struct dwarf_section *section, void *file)
                        bucket_count),
              buckets_filled, (unsigned long) bucket_count);
 
-      uint32_t hash_prev = 0;
-      size_t hash_clash_count = 0;
-      size_t longest_clash = 0;
-      size_t this_length = 0;
-      size_t hashi;
-      for (hashi = 0; hashi < name_count; hashi++)
-       {
-         const uint32_t hash_this = hash_table_hashes[hashi];
-
-         if (hashi > 0)
+      if (bucket_count != 0)
+       {
+         uint32_t hash_prev = 0;
+         size_t hash_clash_count = 0;
+         size_t longest_clash = 0;
+         size_t this_length = 0;
+         size_t hashi;
+         for (hashi = 0; hashi < name_count; hashi++)
            {
-             if (hash_prev % bucket_count == hash_this % bucket_count)
+             const uint32_t hash_this = hash_table_hashes[hashi];
+
+             if (hashi > 0)
                {
-                 ++hash_clash_count;
-                 ++this_length;
-                 longest_clash = MAX (longest_clash, this_length);
+                 if (hash_prev % bucket_count == hash_this % bucket_count)
+                   {
+                     ++hash_clash_count;
+                     ++this_length;
+                     longest_clash = MAX (longest_clash, this_length);
+                   }
+                 else
+                   this_length = 0;
                }
-             else
-               this_length = 0;
+             hash_prev = hash_this;
            }
-         hash_prev = hash_this;
+         printf (_("Out of %lu items there are %zu bucket clashes"
+                   " (longest of %zu entries).\n"),
+                 (unsigned long) name_count, hash_clash_count, longest_clash);
+         assert (name_count == buckets_filled + hash_clash_count);
        }
-      printf (_("Out of %lu items there are %zu bucket clashes"
-               " (longest of %zu entries).\n"),
-             (unsigned long) name_count, hash_clash_count, longest_clash);
-      assert (name_count == buckets_filled + hash_clash_count);
 
       struct abbrev_lookup_entry
       {