This is the mail archive of the binutils-cvs@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]

[binutils-gdb] MIPS/readelf: Simplify GOT[1] data availability check


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c4ab9505b53cdc899506ed421fddb7e1f8faf7a3

commit c4ab9505b53cdc899506ed421fddb7e1f8faf7a3
Author: Maciej W. Rozycki <macro@imgtec.com>
Date:   Wed Apr 12 00:03:41 2017 +0100

    MIPS/readelf: Simplify GOT[1] data availability check
    
    Unavailable data is handled gracefully in MIPS GOT processing done by
    `print_mips_got_entry', so all that is needed in special GOT[1] handling
    is to verify whether data can be retrieved for the purpose of the GNU
    marker check done with `byte_get'.  Remove the extra error reporting
    code then, introduced with commit 75ec1fdbb797 ("Fix runtime seg-fault
    in readelf when parsing a corrupt MIPS binary.") in the course of
    addressing PR binutils/21344, and defer the error case to regular local
    GOT entry processing.
    
    	binutils/
    	* readelf.c (process_mips_specific): Remove error reporting from
    	GOT[1] processing.

Diff:
---
 binutils/ChangeLog |  5 +++++
 binutils/readelf.c | 32 ++++++++++++++------------------
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0b6a712..7f8e29d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,10 @@
 2017-04-25  Maciej W. Rozycki  <macro@imgtec.com>
 
+	* readelf.c (process_mips_specific): Remove error reporting from
+	GOT[1] processing.
+
+2017-04-25  Maciej W. Rozycki  <macro@imgtec.com>
+
 	* readelf.c (process_mips_specific): Remove null GOT data check.
 
 2017-04-25  Maciej W. Rozycki  <macro@imgtec.com>
diff --git a/binutils/readelf.c b/binutils/readelf.c
index d4c4137..1139f71 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -15500,24 +15500,20 @@ process_mips_specific (FILE * file)
       if (ent == (bfd_vma) -1)
 	goto got_print_fail;
 
-      if (data)
-	{
-	  /* PR 21344 */
-	  if (data + ent - pltgot > data_end - addr_size)
-	    {
-	      error (_("Invalid got entry - %#lx - overflows GOT table\n"),
-		     (long) ent);
-	      goto got_print_fail;
-	    }
-	  
-	  if (byte_get (data + ent - pltgot, addr_size)
-	      >> (addr_size * 8 - 1) != 0)
-	    {
-	      ent = print_mips_got_entry (data, pltgot, ent, data_end);
-	      printf (_(" Module pointer (GNU extension)\n"));
-	      if (ent == (bfd_vma) -1)
-		goto got_print_fail;
-	    }
+      /* Check for the MSB of GOT[1] being set, denoting a GNU object.
+	 This entry will be used by some runtime loaders, to store the
+	 module pointer.  Otherwise this is an ordinary local entry.
+	 PR 21344: Check for the entry being fully available before
+	 fetching it.  */
+      if (data
+	  && data + ent - pltgot + addr_size <= data_end
+	  && (byte_get (data + ent - pltgot, addr_size)
+	      >> (addr_size * 8 - 1)) != 0)
+	{
+	  ent = print_mips_got_entry (data, pltgot, ent, data_end);
+	  printf (_(" Module pointer (GNU extension)\n"));
+	  if (ent == (bfd_vma) -1)
+	    goto got_print_fail;
 	}
       printf ("\n");


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