diff options
author | Nick Clifton <nickc@redhat.com> | 2025-01-16 15:48:40 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2025-01-16 15:48:40 +0000 |
commit | 978dae651ef1086b4b34b7754afaefe27258f42e (patch) | |
tree | de4f20794040b85b22456b08339d3e64da8e26f3 /binutils | |
parent | 18d2e794052bd6386e510ae367e0d7599e847426 (diff) | |
download | binutils-978dae651ef1086b4b34b7754afaefe27258f42e.zip binutils-978dae651ef1086b4b34b7754afaefe27258f42e.tar.gz binutils-978dae651ef1086b4b34b7754afaefe27258f42e.tar.bz2 |
Have readelf sanitize the program interpreter string before displaying it.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/readelf.c | 109 |
1 files changed, 68 insertions, 41 deletions
diff --git a/binutils/readelf.c b/binutils/readelf.c index 694d826..70d0c53 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -887,44 +887,39 @@ print_symbol_name (signed int width, const char * symbol) } /* Returns a pointer to a static buffer containing a printable version of - the given section's name. Like print_symbol, except that it does not try - to print multibyte characters, it just interprets them as hex values. */ + STRING. Uses a rotating array of static buffers, so that multiple + successive calls will still work. eg when used in a call to printf(). + + If supplied MAX_LEN is the maximum number of characters to be read + starting from STRING. + + This function is similar to print_symbol_name(), except that it does + not try to print multibyte characters, it just shows them as hex values. + + If the string is too long for the static buffer or if it is not + terminated then a truncated version of the string will be returned. */ static const char * -printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec) +printable_string (const char * string, unsigned int max_len) { -#define NUM_SEC_NAME_BUFS 5 -#define MAX_PRINT_SEC_NAME_LEN 256 - - static int sec_name_buf_index = 0; - /* We use a rotating array of static buffers, so that multiple successive calls - to printable_section_name() will still work. eg when used in a printf. */ - static char sec_name_buf [NUM_SEC_NAME_BUFS][MAX_PRINT_SEC_NAME_LEN + 1]; +#define NUM_STRING_BUFS 5 +#define MAX_STRING_LEN 256 - const char * name; + static int string_buf_index = 0; + static char string_buf [NUM_STRING_BUFS][MAX_STRING_LEN + 1]; + char * buf; char * buf_start; - char c; - unsigned int remaining = MAX_PRINT_SEC_NAME_LEN; - - /* Validate the input parameters. */ - if (filedata == NULL) - return _("<internal error>"); - if (sec == NULL) - return _("<none>"); - if (filedata->string_table == NULL) - return _("<no-strings>"); - if (sec->sh_name >= filedata->string_table_length) - return _("<corrupt>"); /* Select a buffer to use. */ - buf_start = buf = sec_name_buf[sec_name_buf_index]; - if (++sec_name_buf_index >= NUM_SEC_NAME_BUFS) - sec_name_buf_index = 0; + buf_start = buf = string_buf[string_buf_index]; + if (++ string_buf_index >= NUM_STRING_BUFS) + string_buf_index = 0; - name = section_name (filedata, sec); - - while ((c = * name ++) != 0) + char c; + unsigned int remaining = MAX_STRING_LEN; + + while ((c = * string ++) != 0) { if (ISCNTRL (c)) { @@ -955,10 +950,37 @@ printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec) if (remaining == 0) break; + + if (max_len > 0) + { + max_len -= 1; + if (max_len == 0) + break; + } } * buf = 0; - return buf_start; + return buf_start; +} + +/* Returns a pointer to a static buffer containing a + printable version of the given section's name. */ + +static const char * +printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec) +{ + /* Validate the input parameters. */ + if (filedata == NULL) + return _("<internal error>"); + if (sec == NULL) + return _("<none>"); + if (filedata->string_table == NULL) + return _("<no-strings>"); + if (sec->sh_name >= filedata->string_table_length) + return _("<corrupt>"); + + return printable_string (section_name (filedata, sec), + filedata->string_table_length - sec->sh_name); } /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI. @@ -6804,7 +6826,8 @@ process_file_header (Filedata * filedata) unsigned i; if (filedata->is_separate) - printf (_("ELF Header in linked file '%s':\n"), filedata->file_name); + printf (_("ELF Header in linked file '%s':\n"), + printable_string (filedata->file_name, 0)); else printf (_("ELF Header:\n")); printf (_(" Magic: ")); @@ -7059,7 +7082,7 @@ process_program_headers (Filedata * filedata) { if (filedata->is_separate) printf (_("\nThere are no program headers in linked file '%s'.\n"), - filedata->file_name); + printable_string (filedata->file_name, 0)); else printf (_("\nThere are no program headers in this file.\n")); } @@ -7070,7 +7093,8 @@ process_program_headers (Filedata * filedata) { if (filedata->is_separate) printf ("\nIn linked file '%s' the ELF file type is %s\n", - filedata->file_name, get_file_type (filedata)); + printable_string (filedata->file_name, 0), + get_file_type (filedata)); else printf (_("\nElf file type is %s\n"), get_file_type (filedata)); printf (_("Entry point 0x%" PRIx64 "\n"), @@ -7311,7 +7335,7 @@ the .dynamic section is not the same as the dynamic segment\n")); if (do_segments) printf (_(" [Requesting program interpreter: %s]\n"), - filedata->program_interpreter); + printable_string (filedata->program_interpreter, 0)); } break; } @@ -8157,7 +8181,8 @@ process_section_headers (Filedata * filedata) if (do_sections && !do_header) { if (filedata->is_separate && process_links) - printf (_("In linked file '%s': "), filedata->file_name); + printf (_("In linked file '%s': "), + printable_string (filedata->file_name, 0)); if (! filedata->is_separate || process_links) printf (ngettext ("There is %d section header, " "starting at offset %#" PRIx64 ":\n", @@ -8424,7 +8449,8 @@ process_section_headers (Filedata * filedata) return true; if (filedata->is_separate) - printf (_("\nSection Headers in linked file '%s':\n"), filedata->file_name); + printf (_("\nSection Headers in linked file '%s':\n"), + printable_string (filedata->file_name, 0)); else if (filedata->file_header.e_shnum > 1) printf (_("\nSection Headers:\n")); else @@ -8920,7 +8946,7 @@ process_section_groups (Filedata * filedata) { if (filedata->is_separate) printf (_("\nThere are no sections group in linked file '%s'.\n"), - filedata->file_name); + printable_string (filedata->file_name, 0)); else printf (_("\nThere are no section groups in this file.\n")); } @@ -8959,7 +8985,7 @@ process_section_groups (Filedata * filedata) { if (filedata->is_separate) printf (_("\nThere are no section groups in linked file '%s'.\n"), - filedata->file_name); + printable_string (filedata->file_name, 0)); else printf (_("\nThere are no section groups in this file.\n")); } @@ -8984,7 +9010,8 @@ process_section_groups (Filedata * filedata) strtab_size = 0; if (filedata->is_separate) - printf (_("Section groups in linked file '%s'\n"), filedata->file_name); + printf (_("Section groups in linked file '%s'\n"), + printable_string (filedata->file_name, 0)); for (i = 0, section = filedata->section_headers, group = filedata->section_groups; i < filedata->file_header.e_shnum; @@ -9412,7 +9439,7 @@ display_relocations (Elf_Internal_Shdr * section, if (filedata->is_separate) printf (_("\nIn linked file '%s' relocation section "), - filedata->file_name); + printable_string (filedata->file_name, 0)); else printf (_("\nRelocation section ")); @@ -12342,7 +12369,7 @@ process_dynamic_section (Filedata * filedata) { if (filedata->is_separate) printf (_("\nThere is no dynamic section in linked file '%s'.\n"), - filedata->file_name); + printable_string (filedata->file_name, 0)); else printf (_("\nThere is no dynamic section in this file.\n")); } |