aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2023-12-04 07:58:48 -0700
committerTom Tromey <tom@tromey.com>2024-01-18 08:20:17 -0700
commit3a862152958a1d17742cef7fc43c4d51dd2dcbab (patch)
tree6f1bfb2ba15de0f1b184670b5eb6b6673f8db523 /gdb
parent36cde74bd8ba912604dd675bc5046c20fb8c5d68 (diff)
downloadgdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.zip
gdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.tar.gz
gdb-3a862152958a1d17742cef7fc43c4d51dd2dcbab.tar.bz2
Empty hash table fix in .debug_names reader
The handling of an empty hash table in the .debug_names reader is slightly wrong. Currently the code assumes there is always an array of hashes. However, section 6.1.1.4.5 Hash Lookup Table says: The optional hash lookup table immediately follows the list of type signatures. and then: The hash lookup table is actually two separate arrays: an array of buckets, followed immediately by an array of hashes. My reading of this is that the hash table as a whole is optional, and so the hashes will not exist in this case. (This also makes sense because the hashes are not useful without the buckets anyway.) Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25950
Diffstat (limited to 'gdb')
-rw-r--r--gdb/dwarf2/read-debug-names.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/gdb/dwarf2/read-debug-names.c b/gdb/dwarf2/read-debug-names.c
index a2a9fd4..b4ff36f 100644
--- a/gdb/dwarf2/read-debug-names.c
+++ b/gdb/dwarf2/read-debug-names.c
@@ -294,7 +294,8 @@ read_debug_names_from_section (struct objfile *objfile,
map.bucket_table_reordered = reinterpret_cast<const uint32_t *> (addr);
addr += map.bucket_count * 4;
map.hash_table_reordered = reinterpret_cast<const uint32_t *> (addr);
- addr += map.name_count * 4;
+ if (map.bucket_count != 0)
+ addr += map.name_count * 4;
/* Name Table */
map.name_table_string_offs_reordered = addr;