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] Stop the assembler from running out of memory when asked to generate a huge number of spaces.


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

commit 005304aae36522a90bbe169faea36db559d0f3d6
Author: Nick Clifton <nickc@redhat.com>
Date:   Tue Dec 6 15:31:14 2016 +0000

    Stop the assembler from running out of memory when asked to generate a huge number of spaces.
    
    	PR gas/20901
    	* read.c (s_space): Place an upper limit on the number of spaces
    	generated.

Diff:
---
 gas/ChangeLog |  4 ++++
 gas/read.c    | 19 ++++++++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index bb6beb8..781e975 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,9 @@
 2016-12-06  Nick Clifton  <nickc@redhat.com>
 
+	PR gas/20901
+	* read.c (s_space): Place an upper limit on the number of spaces
+	generated.
+
 	PR gas/20896
 	* testsuite/gas/mmix/err-byte1.s: Adjust expected warning messages
 	to account for patch to next_char_of_string.
diff --git a/gas/read.c b/gas/read.c
index 0cc0d20..08b8846 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -3394,11 +3394,20 @@ s_space (int mult)
 	{
 	  offsetT i;
 
-	  if (mult == 0)
-	    mult = 1;
-	  bytes = mult * exp.X_add_number;
-	  for (i = 0; i < exp.X_add_number; i++)
-	    emit_expr (&val, mult);
+	  /* PR 20901: Check for excessive values.
+	     FIXME: 1<<10 is an arbitrary limit.  Maybe use maxpagesize instead ?  */
+	  if (exp.X_add_number < 0 || exp.X_add_number > (1 << 10))
+	    as_bad (_("size value for s_space directive too large: %lx"),
+		    (long) exp.X_add_number);
+	  else
+	    {
+	      if (mult == 0)
+		mult = 1;
+	      bytes = mult * exp.X_add_number;
+
+	      for (i = 0; i < exp.X_add_number; i++)
+		emit_expr (&val, mult);
+	    }
 	}
     }
   else


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