From f8eae8b28b412fc8d9c8bad1961447652a306dd2 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 29 Oct 2006 19:07:54 +0000 Subject: [PATCH] 2006-10-29 H.J. Lu PR binutils/3384 * configure.in (AC_CHECK_HEADERS): Add limits.h and sys/param.h. * configure: Regenerated. * config.in: Likewise. * readelf.c: Include and for PATH_MAX. (program_interpreter): Allocate PATH_MAX bytes instead of 64. (process_program_headers): Don't assume that program interpreter is shorter than 64 characters. --- binutils/ChangeLog | 12 ++++++++++++ binutils/configure | 4 +++- binutils/configure.in | 2 +- binutils/readelf.c | 29 +++++++++++++++++++++++++++-- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index d82cd78a5dc..7b935d91f65 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,15 @@ +2006-10-29 H.J. Lu + + PR binutils/3384 + * configure.in (AC_CHECK_HEADERS): Add limits.h and sys/param.h. + * configure: Regenerated. + * config.in: Likewise. + + * readelf.c: Include and for PATH_MAX. + (program_interpreter): Allocate PATH_MAX bytes instead of 64. + (process_program_headers): Don't assume that program interpreter + is shorter than 64 characters. + 2006-10-25 Trevor Smigiel Yukishige Shibata Nobuhisa Fujinami diff --git a/binutils/configure b/binutils/configure index 83e632d1540..412483013bc 100755 --- a/binutils/configure +++ b/binutils/configure @@ -6425,7 +6425,9 @@ done -for ac_header in string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h + + +for ac_header in string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h limits.h sys/param.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then diff --git a/binutils/configure.in b/binutils/configure.in index 7b63f4dccc9..f2f3db8d74c 100644 --- a/binutils/configure.in +++ b/binutils/configure.in @@ -80,7 +80,7 @@ case "${host}" in esac AC_SUBST(DEMANGLER_NAME) -AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h) +AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h limits.h sys/param.h) AC_HEADER_SYS_WAIT AC_FUNC_ALLOCA AC_CHECK_FUNCS(sbrk utimes setmode getc_unlocked strcoll) diff --git a/binutils/readelf.c b/binutils/readelf.c index 04490fe70c3..9e015e24f83 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -47,6 +47,25 @@ #include #include +/* for PATH_MAX */ +#ifdef HAVE_LIMITS_H +#include +#endif + +#ifndef PATH_MAX +/* for MAXPATHLEN */ +# ifdef HAVE_SYS_PARAM_H +# include +# endif +# ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 1024 +# endif +# endif +#endif + #if __GNUC__ >= 2 /* Define BFD64 here, even if our default architecture is 32 bit ELF as this will allow us to read in and parse 64bit and 32bit ELF files. @@ -135,7 +154,7 @@ static Elf_Internal_Sym *dynamic_symbols; static Elf_Internal_Syminfo *dynamic_syminfo; static unsigned long dynamic_syminfo_offset; static unsigned int dynamic_syminfo_nent; -static char program_interpreter[64]; +static char program_interpreter[PATH_MAX]; static bfd_vma dynamic_info[DT_JMPREL + 1]; static bfd_vma dynamic_info_DT_GNU_HASH; static bfd_vma version_info[16]; @@ -3492,8 +3511,14 @@ process_program_headers (FILE *file) error (_("Unable to find program interpreter name\n")); else { + char fmt [32]; + int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX); + + if (ret >= (int) sizeof (fmt) || ret < 0) + error (_("Internal error: failed to create format string to display program interpreter")); + program_interpreter[0] = 0; - fscanf (file, "%63s", program_interpreter); + fscanf (file, fmt, program_interpreter); if (do_segments) printf (_("\n [Requesting program interpreter: %s]"), -- 2.30.2