diff options
author | Alan Modra <amodra@gmail.com> | 2021-04-14 12:42:27 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-04-14 15:06:11 +0930 |
commit | 13acb58d42e7c66d0d69240cc6b7a0fbf8290da4 (patch) | |
tree | d604a4a4ff4ed2999618405c5635f106e4b99e26 /binutils | |
parent | d20eb46617fc6170e144f80dcbaffbc3f4ff6090 (diff) | |
download | gdb-13acb58d42e7c66d0d69240cc6b7a0fbf8290da4.zip gdb-13acb58d42e7c66d0d69240cc6b7a0fbf8290da4.tar.gz gdb-13acb58d42e7c66d0d69240cc6b7a0fbf8290da4.tar.bz2 |
PR27716, build failure for msdosdjgpp: PATH_MAX undeclared
We shouldn't be using arbitrary limits like PATH_MAX in GNU programs.
This patch also fixes some memory leaks in readelf when processing
separate debug info.
PR 27716
binutils/
* objdump.c (show_line): Don't limit paths to PATH_MAX.
* readelf.c (struct filedata): Change program_interpreter from
a char array to a char pointer.
(process_program_headers): Sanity check PT_INTERP p_filesz.
Malloc program_interpreter using p_filesz and read directly from
file.
(process_dynamic_section): Check program_interpreter is non-NULL.
(free_filedata): New function, split out from..
(process_object): ..here.
(close_debug_file): Call free_filedata.
* sysdep.h: Don't include sys/param.h.
(PATH_MAX): Don't define.
* configure.ac: Don't check for sys/param.h.
* configure: Regenerate.
gprof/
* gprof.h (PATH_MAX): Don't define.
* corefile.c (core_create_line_syms): Don't use PATH_MAX for initial
file name size.
* source.c (annotate_source): Malloc file name buffer. Always
trim off "-ann" when dos 8.3 annotate file matches original.
* utils.c (print_name_only): Malloc file name buffer.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 18 | ||||
-rwxr-xr-x | binutils/configure | 2 | ||||
-rw-r--r-- | binutils/configure.ac | 2 | ||||
-rw-r--r-- | binutils/objdump.c | 5 | ||||
-rw-r--r-- | binutils/readelf.c | 151 | ||||
-rw-r--r-- | binutils/sysdep.h | 15 |
6 files changed, 103 insertions, 90 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index ef0e868..5148da4 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,21 @@ +2021-04-14 Alan Modra <amodra@gmail.com> + + PR 27716 + * objdump.c (show_line): Don't limit paths to PATH_MAX. + * readelf.c (struct filedata): Change program_interpreter from + a char array to a char pointer. + (process_program_headers): Sanity check PT_INTERP p_filesz. + Malloc program_interpreter using p_filesz and read directly from + file. + (process_dynamic_section): Check program_interpreter is non-NULL. + (free_filedata): New function, split out from.. + (process_object): ..here. + (close_debug_file): Call free_filedata. + * sysdep.h: Don't include sys/param.h. + (PATH_MAX): Don't define. + * configure.ac: Don't check for sys/param.h. + * configure: Regenerate. + 2021-04-13 Frederic Cambus <fred@statdns.com> * readelf.c (process_netbsd_elf_note): Remove now unneeded #ifdef diff --git a/binutils/configure b/binutils/configure index 938ef48..8272032 100755 --- a/binutils/configure +++ b/binutils/configure @@ -12983,7 +12983,7 @@ _ACEOF # guarantees they are available. # plugin-api.h tests HAVE_STDINT_H and HAVE_INTTYPES_H # Besides those, we need to check anything used in binutils/ not in C99. -for ac_header in fcntl.h inttypes.h stdint.h sys/file.h sys/param.h \ +for ac_header in fcntl.h inttypes.h stdint.h sys/file.h \ sys/stat.h sys/types.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` diff --git a/binutils/configure.ac b/binutils/configure.ac index 2553b80..3c5a8e1 100644 --- a/binutils/configure.ac +++ b/binutils/configure.ac @@ -181,7 +181,7 @@ AC_CHECK_SIZEOF([long long]) # guarantees they are available. # plugin-api.h tests HAVE_STDINT_H and HAVE_INTTYPES_H # Besides those, we need to check anything used in binutils/ not in C99. -AC_CHECK_HEADERS(fcntl.h inttypes.h stdint.h sys/file.h sys/param.h \ +AC_CHECK_HEADERS(fcntl.h inttypes.h stdint.h sys/file.h \ sys/stat.h sys/types.h unistd.h) AC_HEADER_SYS_WAIT AC_FUNC_MMAP diff --git a/binutils/objdump.c b/binutils/objdump.c index 3e6bf72..39b5793 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -1739,7 +1739,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) char *path_up; const char *fname = filename; - path = xmalloc (prefix_length + PATH_MAX + 1); + path = xmalloc (prefix_length + 1 + strlen (filename)); if (prefix_length) memcpy (path, prefix, prefix_length); @@ -1762,8 +1762,7 @@ show_line (bfd *abfd, asection *section, bfd_vma addr_offset) } /* Update complete filename. */ - strncpy (path_up, fname, PATH_MAX); - path_up[PATH_MAX] = '\0'; + strcpy (path_up, fname); filename = path; reloc = true; diff --git a/binutils/readelf.c b/binutils/readelf.c index 9d0104d..dc7764a 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -292,7 +292,7 @@ typedef struct filedata bfd_vma * gnuchains; bfd_vma * mipsxlat; bfd_vma gnusymidx; - char program_interpreter[PATH_MAX]; + char * program_interpreter; bfd_vma dynamic_info[DT_ENCODING]; bfd_vma dynamic_info_DT_GNU_HASH; bfd_vma dynamic_info_DT_MIPS_XHASH; @@ -5538,22 +5538,21 @@ the .dynamic section is not the same as the dynamic segment\n")); break; case PT_INTERP: - if (fseek (filedata->handle, - filedata->archive_file_offset + (long) segment->p_offset, - SEEK_SET)) + if (segment->p_offset >= filedata->file_size + || segment->p_filesz > filedata->file_size - segment->p_offset + || segment->p_filesz - 1 >= (size_t) -2 + || fseek (filedata->handle, + filedata->archive_file_offset + (long) segment->p_offset, + SEEK_SET)) error (_("Unable to find program interpreter name\n")); else { - char fmt [32]; - int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1); - - if (ret >= (int) sizeof (fmt) || ret < 0) - error (_("Internal error: failed to create format string to display program interpreter\n")); - - filedata->program_interpreter[0] = 0; - if (fscanf (filedata->handle, fmt, - filedata->program_interpreter) <= 0) - error (_("Unable to read program interpreter name\n")); + size_t len = segment->p_filesz; + free (filedata->program_interpreter); + filedata->program_interpreter = xmalloc (len + 1); + len = fread (filedata->program_interpreter, 1, len, + filedata->handle); + filedata->program_interpreter[len] = 0; if (do_segments) printf (_(" [Requesting program interpreter: %s]\n"), @@ -11094,7 +11093,8 @@ the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n")); case DT_NEEDED: printf (_("Shared library: [%s]"), name); - if (streq (name, filedata->program_interpreter)) + if (filedata->program_interpreter + && streq (name, filedata->program_interpreter)) printf (_(" program interpreter")); break; @@ -21051,6 +21051,70 @@ get_file_header (Filedata * filedata) } static void +free_filedata (Filedata *filedata) +{ + free (filedata->program_interpreter); + filedata->program_interpreter = NULL; + + free (filedata->program_headers); + filedata->program_headers = NULL; + + free (filedata->section_headers); + filedata->section_headers = NULL; + + free (filedata->string_table); + filedata->string_table = NULL; + filedata->string_table_length = 0; + + free (filedata->dump.dump_sects); + filedata->dump.dump_sects = NULL; + filedata->dump.num_dump_sects = 0; + + free (filedata->dynamic_strings); + filedata->dynamic_strings = NULL; + filedata->dynamic_strings_length = 0; + + free (filedata->dynamic_symbols); + filedata->dynamic_symbols = NULL; + filedata->num_dynamic_syms = 0; + + free (filedata->dynamic_syminfo); + filedata->dynamic_syminfo = NULL; + + free (filedata->dynamic_section); + filedata->dynamic_section = NULL; + + while (filedata->symtab_shndx_list != NULL) + { + elf_section_list *next = filedata->symtab_shndx_list->next; + free (filedata->symtab_shndx_list); + filedata->symtab_shndx_list = next; + } + + free (filedata->section_headers_groups); + filedata->section_headers_groups = NULL; + + if (filedata->section_groups) + { + size_t i; + struct group_list * g; + struct group_list * next; + + for (i = 0; i < filedata->group_count; i++) + { + for (g = filedata->section_groups [i].root; g != NULL; g = next) + { + next = g->next; + free (g); + } + } + + free (filedata->section_groups); + filedata->section_groups = NULL; + } +} + +static void close_file (Filedata * filedata) { if (filedata) @@ -21064,6 +21128,7 @@ close_file (Filedata * filedata) void close_debug_file (void * data) { + free_filedata ((Filedata *) data); close_file ((Filedata *) data); } @@ -21277,61 +21342,7 @@ process_object (Filedata * filedata) if (! process_arch_specific (filedata)) res = false; - free (filedata->program_headers); - filedata->program_headers = NULL; - - free (filedata->section_headers); - filedata->section_headers = NULL; - - free (filedata->string_table); - filedata->string_table = NULL; - filedata->string_table_length = 0; - - free (filedata->dump.dump_sects); - filedata->dump.dump_sects = NULL; - filedata->dump.num_dump_sects = 0; - - free (filedata->dynamic_strings); - filedata->dynamic_strings = NULL; - filedata->dynamic_strings_length = 0; - - free (filedata->dynamic_symbols); - filedata->dynamic_symbols = NULL; - filedata->num_dynamic_syms = 0; - - free (filedata->dynamic_syminfo); - filedata->dynamic_syminfo = NULL; - - free (filedata->dynamic_section); - filedata->dynamic_section = NULL; - - while (filedata->symtab_shndx_list != NULL) - { - elf_section_list *next = filedata->symtab_shndx_list->next; - free (filedata->symtab_shndx_list); - filedata->symtab_shndx_list = next; - } - - free (filedata->section_headers_groups); - filedata->section_headers_groups = NULL; - - if (filedata->section_groups) - { - struct group_list * g; - struct group_list * next; - - for (i = 0; i < filedata->group_count; i++) - { - for (g = filedata->section_groups [i].root; g != NULL; g = next) - { - next = g->next; - free (g); - } - } - - free (filedata->section_groups); - filedata->section_groups = NULL; - } + free_filedata (filedata); free_debug_memory (); diff --git a/binutils/sysdep.h b/binutils/sysdep.h index 747ff4c..16601e5 100644 --- a/binutils/sysdep.h +++ b/binutils/sysdep.h @@ -124,23 +124,8 @@ extern char **environ; /* Used by ar.c and objcopy.c. */ #define BUFSIZE 8192 -/* For PATH_MAX. */ #include <limits.h> -#ifndef PATH_MAX -/* For MAXPATHLEN. */ -# ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -# endif -# ifndef PATH_MAX -# ifdef MAXPATHLEN -# define PATH_MAX MAXPATHLEN -# else -# define PATH_MAX 1024 -# endif -# endif -#endif - #if SIZEOF_LONG_LONG > SIZEOF_LONG /* We can't use any bfd types here since readelf may define BFD64 and objdump may not. */ |