aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2022-06-27 11:48:24 +0100
committerNick Clifton <nickc@redhat.com>2022-06-27 11:49:14 +0100
commita3f1431a5087445ec3987d38b5ee37bcb802214c (patch)
treebb628b59bdad6582504286099389ec532c4267fb /binutils
parent2135495484109f888167287cca249be9d84ed535 (diff)
downloadbinutils-a3f1431a5087445ec3987d38b5ee37bcb802214c.zip
binutils-a3f1431a5087445ec3987d38b5ee37bcb802214c.tar.gz
binutils-a3f1431a5087445ec3987d38b5ee37bcb802214c.tar.bz2
Stop bogus warnings about DWARF indexed string offsets being too big.
* dwarf.c (fetch_indexed_string): Do not use length of first table in string section as the length of every table in the section. * testsuite/binutils-all/pr26112.r: Update expected output.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/dwarf.c89
-rw-r--r--binutils/testsuite/binutils-all/pr26112.r6
3 files changed, 26 insertions, 75 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index ebd5473..48a3750 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2022-06-27 Nick Clifton <nickc@redhat.com>
+
+ * dwarf.c (fetch_indexed_string): Do not use length of first table
+ in string section as the length of every table in the section.
+ * testsuite/binutils-all/pr26112.r: Update expected output.
+
2022-06-22 Kumar N, Bhuvanendra <Kavitha.Natarajan@amd.com>
* dwarf.c (fetch_indexed_string): Added new parameter
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index d9a1ee5..bcabb61 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -703,8 +703,6 @@ fetch_indexed_string (dwarf_vma idx,
dwarf_vma index_offset;
dwarf_vma str_offset;
const char * ret;
- unsigned char *curr, *end;
- dwarf_vma length;
if (index_section->start == NULL)
return (dwo ? _("<no .debug_str_offsets.dwo section>")
@@ -714,99 +712,46 @@ fetch_indexed_string (dwarf_vma idx,
return (dwo ? _("<no .debug_str.dwo section>")
: _("<no .debug_str section>"));
- curr = index_section->start;
- end = curr + index_section->size;
- /* FIXME: We should cache the length... */
- SAFE_BYTE_GET_AND_INC (length, curr, 4, end);
- if (length == 0xffffffff)
- {
- if (offset_size != 8)
- warn (_("Expected offset size of 8 but given %s"), dwarf_vmatoa ("x", offset_size));
- SAFE_BYTE_GET_AND_INC (length, curr, 8, end);
- }
- else if (offset_size != 4)
- {
- warn (_("Expected offset size of 4 but given %s"), dwarf_vmatoa ("x", offset_size));
- }
-
- if (length == 0)
- {
- /* This is probably an old style .debug_str_offset section which
- just contains offsets and no header (and the first offset is 0). */
- curr = index_section->start;
- length = index_section->size;
- }
- else
- {
- /* Skip the version and padding bytes.
- We assume that they are correct. */
- if (end - curr >= 4)
- curr += 4;
- else
- curr = end;
- if (length >= 4)
- length -= 4;
- else
- length = 0;
-
- if (this_set != NULL
- && this_set->section_sizes[DW_SECT_STR_OFFSETS] < length)
- length = this_set->section_sizes[DW_SECT_STR_OFFSETS];
-
- if (length > (dwarf_vma) (end - curr))
- {
- warn (_("index table size too large for section %s vs %s\n"),
- dwarf_vmatoa ("x", length),
- dwarf_vmatoa ("x", index_section->size));
- length = end - curr;
- }
-
- if (length < offset_size)
- {
- warn (_("index table size %s is too small\n"),
- dwarf_vmatoa ("x", length));
- return _("<table too small>");
- }
- }
-
index_offset = idx * offset_size;
if (this_set != NULL)
index_offset += this_set->section_offsets [DW_SECT_STR_OFFSETS];
- if (index_offset >= length
- || length - index_offset < offset_size)
+ index_offset += str_offsets_base;
+
+ if (index_offset + offset_size > index_section->size)
{
- warn (_("DW_FORM_GNU_str_index offset too big: 0x%s vs 0x%s\n"),
+ warn (_("string index of %s converts to an offset of 0x%s which is too big for section %s"),
+ dwarf_vmatoa ("d", idx),
dwarf_vmatoa ("x", index_offset),
- dwarf_vmatoa ("x", length));
- return _("<index offset is too big>");
- }
+ str_section->name);
- if (str_offsets_base > 0)
- {
- if (offset_size == 8)
- str_offsets_base -= 16;
- else
- str_offsets_base -= 8;
+ return _("<string index too big>");
}
- str_offset = byte_get (curr + index_offset + str_offsets_base, offset_size);
+ /* FIXME: If we are being paranoid then we should also check to see if
+ IDX references an entry beyond the end of the string table pointed to
+ by STR_OFFSETS_BASE. (Since there can be more than one string table
+ in a DWARF string section). */
+
+ str_offset = byte_get (index_section->start + index_offset, offset_size);
+
str_offset -= str_section->address;
if (str_offset >= str_section->size)
{
- warn (_("DW_FORM_GNU_str_index indirect offset too big: 0x%s\n"),
+ warn (_("indirect offset too big: 0x%s\n"),
dwarf_vmatoa ("x", str_offset));
return _("<indirect index offset is too big>");
}
ret = (const char *) str_section->start + str_offset;
+
/* Unfortunately we cannot rely upon str_section ending with a NUL byte.
Since our caller is expecting to receive a well formed C string we test
for the lack of a terminating byte here. */
if (strnlen (ret, str_section->size - str_offset)
== str_section->size - str_offset)
- ret = (const char *) _("<no NUL byte at end of section>");
+ return _("<no NUL byte at end of section>");
return ret;
}
diff --git a/binutils/testsuite/binutils-all/pr26112.r b/binutils/testsuite/binutils-all/pr26112.r
index b82b060..f284413 100644
--- a/binutils/testsuite/binutils-all/pr26112.r
+++ b/binutils/testsuite/binutils-all/pr26112.r
@@ -6,8 +6,10 @@ Contents of the .debug_macro section:
Offset into .debug_line: 0x0
DW_MACRO_start_file - lineno: 0 filenum: 1
- DW_MACRO_define_strx lineno : 1 macro : FOO bar
+ DW_MACRO_define_strx lineno : 1 macro : -
DW_MACRO_end_file
+ DW_MACRO_define_strx lineno : 0 macro : /home/tstellar/llvm-project/clang-build
+ DW_MACRO_define_strx lineno : 0 macro : FOO bar
DW_MACRO_define_strx lineno : 0 macro : __llvm__ 1
DW_MACRO_define_strx lineno : 0 macro : __clang__ 1
DW_MACRO_define_strx lineno : 0 macro : __clang_major__ 11
@@ -346,5 +348,3 @@ Contents of the .debug_macro section:
DW_MACRO_define_strx lineno : 0 macro : __STDC__ 1
DW_MACRO_define_strx lineno : 0 macro : __STDC_HOSTED__ 1
DW_MACRO_define_strx lineno : 0 macro : __STDC_VERSION__ 201710L
- DW_MACRO_define_strx lineno : 0 macro : __STDC_UTF_16__ 1
- DW_MACRO_define_strx lineno : 0 macro : __STDC_UTF_32__ 1