diff options
author | Alan Modra <amodra@gmail.com> | 2021-05-15 14:58:37 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-05-15 15:01:39 +0930 |
commit | 35b2c89ec8bbcbf6894cb6ae408d97cbe06bbeb4 (patch) | |
tree | 2b385e0254463af27c629d664add2285ccc1dc12 /binutils | |
parent | 56051e28a33aa6b3c37a61d4647da324c21bc64d (diff) | |
download | fsf-binutils-gdb-35b2c89ec8bbcbf6894cb6ae408d97cbe06bbeb4.zip fsf-binutils-gdb-35b2c89ec8bbcbf6894cb6ae408d97cbe06bbeb4.tar.gz fsf-binutils-gdb-35b2c89ec8bbcbf6894cb6ae408d97cbe06bbeb4.tar.bz2 |
display_debug_pubnames_worker
* dwarf.c (display_debug_pubnames_worker): Delete initial_length_size.
Simplify length check. Constrain reads to length given by header.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/dwarf.c | 34 |
2 files changed, 19 insertions, 20 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 5efa930..5fd8bc1 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,5 +1,10 @@ 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> + * dwarf.c (display_debug_lines_decoded): Don't use strnlen when we have already checked for NUL termination. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index e881cee..878f4f7 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -5616,29 +5616,23 @@ display_debug_pubnames_worker (struct dwarf_section *section, while (start < end) { unsigned char *data; - unsigned long sec_off; - unsigned int offset_size, initial_length_size; + unsigned long sec_off = start - section->start; + unsigned int offset_size; SAFE_BYTE_GET_AND_INC (names.pn_length, start, 4, end); if (names.pn_length == 0xffffffff) { SAFE_BYTE_GET_AND_INC (names.pn_length, start, 8, end); offset_size = 8; - initial_length_size = 12; } else - { - offset_size = 4; - initial_length_size = 4; - } + offset_size = 4; - sec_off = start - section->start; - if (sec_off + names.pn_length < sec_off - || sec_off + names.pn_length > section->size) + if (names.pn_length > (size_t) (end - start)) { warn (_("Debug info is corrupted, %s header at %#lx has length %s\n"), section->name, - sec_off - initial_length_size, + sec_off, dwarf_vmatoa ("x", names.pn_length)); break; } @@ -5646,8 +5640,8 @@ display_debug_pubnames_worker (struct dwarf_section *section, data = start; start += names.pn_length; - SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, end); - SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, end); + SAFE_BYTE_GET_AND_INC (names.pn_version, data, 2, start); + SAFE_BYTE_GET_AND_INC (names.pn_offset, data, offset_size, start); if (num_debug_info_entries != DEBUG_INFO_UNAVAILABLE && 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"), (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"), (long) names.pn_length); @@ -5689,14 +5683,14 @@ display_debug_pubnames_worker (struct dwarf_section *section, bfd_size_type maxprint; 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) break; - if (data >= end) + if (data >= start) break; - maxprint = (end - data) - 1; + maxprint = (start - data) - 1; if (is_gnu) { @@ -5705,7 +5699,7 @@ display_debug_pubnames_worker (struct dwarf_section *section, const char *kind_name; int is_static; - SAFE_BYTE_GET_AND_INC (kind_data, data, 1, end); + SAFE_BYTE_GET_AND_INC (kind_data, data, 1, start); maxprint --; /* GCC computes the kind as the upper byte in the CU index 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); data += strnlen ((char *) data, maxprint); - if (data < end) + if (data < start) data++; - if (data >= end) + if (data >= start) break; } } |