display_debug_pubnames_worker

* dwarf.c (display_debug_pubnames_worker): Delete initial_length_size.
	Simplify length check.  Constrain reads to length given by header.
This commit is contained in:
Alan Modra
2021-05-15 14:58:37 +09:30
parent 56051e28a3
commit 35b2c89ec8
2 changed files with 19 additions and 20 deletions

View File

@ -1,3 +1,8 @@
2021-05-15 Alan Modra <amodra@gmail.com>
* dwarf.c (display_debug_pubnames_worker): Delete initial_length_size.
Simplify length check. Constrain reads to length given by header.
2021-05-15 Alan Modra <amodra@gmail.com> 2021-05-15 Alan Modra <amodra@gmail.com>
* dwarf.c (display_debug_lines_decoded): Don't use strnlen when * dwarf.c (display_debug_lines_decoded): Don't use strnlen when

View File

@ -5616,29 +5616,23 @@ display_debug_pubnames_worker (struct dwarf_section *section,
while (start < end) while (start < end)
{ {
unsigned char *data; unsigned char *data;
unsigned long sec_off; unsigned long sec_off = start - section->start;
unsigned int offset_size, initial_length_size; unsigned int offset_size;
SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end); SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end);
if (names.pn_length == 0xffffffff) if (names.pn_length == 0xffffffff)
{ {
SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end); SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end);
offset_size = 8; offset_size = 8;
initial_length_size = 12;
} }
else else
{ offset_size = 4;
offset_size = 4;
initial_length_size = 4;
}
sec_off = start - section->start; if (names.pn_length > (size_t) (end - start))
if (sec_off + names.pn_length < sec_off
|| sec_off + names.pn_length > section->size)
{ {
warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"), warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"),
section->name, section->name,
sec_off - initial_length_size, sec_off,
dwarf_vmatoa ("x", names.pn_length)); dwarf_vmatoa ("x", names.pn_length));
break; break;
} }
@ -5646,8 +5640,8 @@ display_debug_pubnames_worker (struct dwarf_section *section,
data = start; data = start;
start += names.pn_length; start += names.pn_length;
SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end); SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, start);
SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end); SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, start);
if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE
&& num_debug_info_entries > 0 && num_debug_info_entries > 0
@ -5655,7 +5649,7 @@ display_debug_pubnames_worker (struct dwarf_section *section,
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"), warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
(unsigned long) names.pn_offset, section->name); (unsigned long) names.pn_offset, section->name);
SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, end); SAFE_BYTE_GET_AND_INC (names.pn_size, data, offset_size, start);
printf (_(" Length: %ld\n"), printf (_(" Length: %ld\n"),
(long) names.pn_length); (long) names.pn_length);
@ -5689,14 +5683,14 @@ display_debug_pubnames_worker (struct dwarf_section *section,
bfd_size_type maxprint; bfd_size_type maxprint;
dwarf_vma offset; dwarf_vma offset;
SAFE_BYTE_GET_AND_INC (offset, data, offset_size, end); SAFE_BYTE_GET_AND_INC (offset, data, offset_size, start);
if (offset == 0) if (offset == 0)
break; break;
if (data >= end) if (data >= start)
break; break;
maxprint = (end - data) - 1; maxprint = (start - data) - 1;
if (is_gnu) if (is_gnu)
{ {
@ -5705,7 +5699,7 @@ display_debug_pubnames_worker (struct dwarf_section *section,
const char *kind_name; const char *kind_name;
int is_static; int is_static;
SAFE_BYTE_GET_AND_INC (kind_data, data, 1, end); SAFE_BYTE_GET_AND_INC (kind_data, data, 1, start);
maxprint --; maxprint --;
/* GCC computes the kind as the upper byte in the CU index /* GCC computes the kind as the upper byte in the CU index
word, and then right shifts it by the CU index size. word, and then right shifts it by the CU index size.
@ -5724,9 +5718,9 @@ display_debug_pubnames_worker (struct dwarf_section *section,
(unsigned long) offset, (int) maxprint, data); (unsigned long) offset, (int) maxprint, data);
data += strnlen ((char *) data, maxprint); data += strnlen ((char *) data, maxprint);
if (data < end) if (data < start)
data++; data++;
if (data >= end) if (data >= start)
break; break;
} }
} }