This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: binutils/3384: readelf displays shortened program interpreter path


Readelf assumes that program interpreter is shorter than 64 characters.
This patch removes this assumption.


H.J.
---
2006-10-24  H.J. Lu  <hongjiu.lu@intel.com>

	PR binutils/3384
	* configure.in (AC_CHECK_HEADERS): Add limits.h and sys/param.h.
	* configure: Regenerated.
	* config.in: Likewise.

	* readelf.c: Include <limits.h> and <sys/param.h> 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/configure.in.long	2006-10-16 09:39:16.000000000 -0700
+++ binutils/configure.in	2006-10-23 09:47:31.000000000 -0700
@@ -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)
--- binutils/readelf.c.long	2006-10-16 09:39:17.000000000 -0700
+++ binutils/readelf.c	2006-10-23 10:10:37.000000000 -0700
@@ -47,6 +47,25 @@
 #include <stdio.h>
 #include <time.h>
 
+/* for PATH_MAX */
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#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 __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.
@@ -134,7 +153,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];
@@ -3485,8 +3504,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 (_("Failed to print program interpreter name\n"));
+
 	      program_interpreter[0] = 0;
-	      fscanf (file, "%63s", program_interpreter);
+	      fscanf (file, fmt, program_interpreter);
 
 	      if (do_segments)
 		printf (_("\n      [Requesting program interpreter: %s]"),


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]