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] Fix address violation when attempting to display disassembled data.


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

commit d16fdddb4e96e9e7bcfce6fe487b321c54b2c7c7
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Jun 19 15:57:19 2017 +0100

    Fix address violation when attempting to display disassembled data.
    
    	PR binutils/21619
    	* objdump.c (disassemble_bytes): Check that there is sufficient
    	data available before attempting to display it.

Diff:
---
 binutils/ChangeLog |  6 ++++++
 binutils/objdump.c | 27 +++++++++++++++------------
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0766e67..6997db9 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-19  Nick Clifton  <nickc@redhat.com>
+
+	PR binutils/21619
+	* objdump.c (disassemble_bytes): Check that there is sufficient
+	data available before attempting to display it.
+
 2017-06-06  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* sysinfo.y: Free memory allocated by token NAME.
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 05402ed..16e1f0e 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -1982,20 +1982,23 @@ disassemble_bytes (struct disassemble_info * inf,
 		    pb = octets;
 		  for (; j < addr_offset * opb + pb; j += bpc)
 		    {
-		      int k;
-
-		      if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
+		      /* PR 21619: Check for a buffer ending early.  */
+		      if (j + bpc <= stop_offset * opb)
 			{
-			  for (k = bpc - 1; k >= 0; k--)
-			    printf ("%02x", (unsigned) data[j + k]);
-			  putchar (' ');
-			}
-		      else
-			{
-			  for (k = 0; k < bpc; k++)
-			    printf ("%02x", (unsigned) data[j + k]);
-			  putchar (' ');
+			  int k;
+
+			  if (inf->display_endian == BFD_ENDIAN_LITTLE)
+			    {
+			      for (k = bpc - 1; k >= 0; k--)
+				printf ("%02x", (unsigned) data[j + k]);
+			    }
+			  else
+			    {
+			      for (k = 0; k < bpc; k++)
+				printf ("%02x", (unsigned) data[j + k]);
+			    }
 			}
+		      putchar (' ');
 		    }
 		}
 	    }


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