This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: binutils/3384: readelf displays shortened program interpreter path
- From: "H. J. Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Date: Mon, 23 Oct 2006 10:14:47 -0700
- Subject: 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]"),