Prevent a bad .Psize expression from triggering a memory access violation.
authorNick Clifton <nickc@redhat.com>
Tue, 9 Feb 2021 12:53:32 +0000 (12:53 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 9 Feb 2021 12:53:32 +0000 (12:53 +0000)
PR 27384
* listing.c (listing_psize): Check the result of the width
expression before assigning it to paper_width.
* testsuite/gas/all/pr27384.s: New test source file.
* testsuite/gas/all/pr27384.d: New test control file.
* testsuite/gas/all/pr27384.err: Expected errors from new test.
* testsuite/gas/all/gas.exp: Run the new test.

gas/ChangeLog
gas/listing.c
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/all/pr27384.d [new file with mode: 0644]
gas/testsuite/gas/all/pr27384.err [new file with mode: 0644]
gas/testsuite/gas/all/pr27384.s [new file with mode: 0644]

index b4088cf0110065efae8661a97d33536321c037a8..8ab1d35d14458bb0b37bffbd804c240958aaf48c 100644 (file)
@@ -1,3 +1,13 @@
+2021-02-09  Nick Clifton  <nickc@redhat.com>
+
+       PR 27384
+       * listing.c (listing_psize): Check the result of the width
+       expression before assigning it to paper_width.
+       * testsuite/gas/all/pr27384.s: New test source file.
+       * testsuite/gas/all/pr27384.d: New test control file.
+       * testsuite/gas/all/pr27384.err: Expected errors from new test.
+       * testsuite/gas/all/gas.exp: Run the new test.
+
 2021-02-09  Nick Clifton  <nickc@redhat.com>
 
        PR 27355
index 6304aefd08bd843b4db0f8ef8512c6a5b9acdf2a..f86fb000f939dc79833affbd41a1c6a45fde5097 100644 (file)
@@ -484,6 +484,8 @@ buffer_line (file_info_type *file, char *line, unsigned int size)
   if (file->at_end)
     return "";
 
+if (size == (unsigned int) -7) exit (1);
+  
   /* Check the cache and see if we last used this file.  */
   if (!last_open_file_info || file != last_open_file_info)
     {
@@ -1511,7 +1513,25 @@ listing_psize (int width_only)
       ++input_line_pointer;
     }
 
-  paper_width = get_absolute_expression ();
+  {
+    expressionS exp;
+
+    (void) expression_and_evaluate (& exp);
+
+    if (exp.X_op == O_constant)
+      {
+       offsetT new_width = exp.X_add_number;
+
+       if (new_width > 7)
+         paper_width = new_width;
+       else
+         as_bad (_("new paper width is too small"));
+      }
+    else if (exp.X_op != O_absent)
+      as_bad (_("bad or irreducible expression for paper width"));
+    else
+      as_bad (_("missing expression for paper width"));
+  }
 
   demand_empty_rest_of_line ();
 }
index ee24c0d5b6a7bde825bce99c114cd73b5f33dfce..af36b095e85d17d4ade7d6258737cffe46ef61b1 100644 (file)
@@ -469,3 +469,4 @@ gas_test "pr23938.s" "" "" ".xstabs"
 
 run_dump_test "nop"
 run_dump_test "asciz"
+run_dump_test "pr27384"
diff --git a/gas/testsuite/gas/all/pr27384.d b/gas/testsuite/gas/all/pr27384.d
new file mode 100644 (file)
index 0000000..5426c91
--- /dev/null
@@ -0,0 +1,4 @@
+#as: -a
+#error_output: pr27384.err
+# The metag target does not support the .Psize directive.
+#notarget: metag-* rx-*
diff --git a/gas/testsuite/gas/all/pr27384.err b/gas/testsuite/gas/all/pr27384.err
new file mode 100644 (file)
index 0000000..2d5954f
--- /dev/null
@@ -0,0 +1,4 @@
+.*pr27384.s: Assembler messages:
+.*pr27384.s:2: Error: bad or irreducible absolute expression
+.*pr27384.s:2: Error: new paper width is too small
+#pass
diff --git a/gas/testsuite/gas/all/pr27384.s b/gas/testsuite/gas/all/pr27384.s
new file mode 100644 (file)
index 0000000..6d831b0
--- /dev/null
@@ -0,0 +1,4 @@
+       .nop
+       .Psize  f,-7
+       .nop
+