From 5fbb38fcc5b2157729407f182287b93531066890 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 24 May 2022 10:22:50 +0930 Subject: [PATCH] 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. --- binutils/dwarf.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/binutils/dwarf.c b/binutils/dwarf.c index c855972a12f..d820c21527f 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++) + if (bucket_count != 0) { - const uint32_t hash_this = hash_table_hashes[hashi]; - - if (hashi > 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 {