aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2022-05-24 10:22:50 +0930
committerAlan Modra <amodra@gmail.com>2022-05-24 10:52:05 +0930
commit5fbb38fcc5b2157729407f182287b93531066890 (patch)
tree0a64bbeb298368a6451cd49784f8fb1a8fe5e7f4
parent244e19c79111eed017ee38ab1d44fb2a6cd1b636 (diff)
downloadgdb-5fbb38fcc5b2157729407f182287b93531066890.zip
gdb-5fbb38fcc5b2157729407f182287b93531066890.tar.gz
gdb-5fbb38fcc5b2157729407f182287b93531066890.tar.bz2
PR29170, divide by zero displaying fuzzed .debug_names
PR 29170 * dwarf.c (display_debug_names): Don't attempt to display bucket clashes when bucket count is zero.
-rw-r--r--binutils/dwarf.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index c855972..d820c21 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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
{