diff options
author | Alan Modra <amodra@gmail.com> | 2022-05-24 10:22:50 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-05-24 10:52:05 +0930 |
commit | 5fbb38fcc5b2157729407f182287b93531066890 (patch) | |
tree | 0a64bbeb298368a6451cd49784f8fb1a8fe5e7f4 | |
parent | 244e19c79111eed017ee38ab1d44fb2a6cd1b636 (diff) | |
download | gdb-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.c | 45 |
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 { |