aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2021-02-09 12:53:32 +0000
committerNick Clifton <nickc@redhat.com>2021-02-09 12:53:32 +0000
commit4a68fcd7f7da92d47f0f41df15fea30f790ed06c (patch)
treefea666ca189d56117d8ff25a6dbb2a53738f3553 /gas
parent52563b0f1c5516930b4507861d261529483a5e83 (diff)
downloadbinutils-4a68fcd7f7da92d47f0f41df15fea30f790ed06c.zip
binutils-4a68fcd7f7da92d47f0f41df15fea30f790ed06c.tar.gz
binutils-4a68fcd7f7da92d47f0f41df15fea30f790ed06c.tar.bz2
Prevent a bad .Psize expression from triggering a memory access violation.
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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/listing.c22
-rw-r--r--gas/testsuite/gas/all/gas.exp1
-rw-r--r--gas/testsuite/gas/all/pr27384.d4
-rw-r--r--gas/testsuite/gas/all/pr27384.err4
-rw-r--r--gas/testsuite/gas/all/pr27384.s4
6 files changed, 44 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index b4088cf..8ab1d35 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,15 @@
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
* testsuite/gas/elf/pr27355.s: New test source file.
* testsuite/gas/elf/pr27355.d: New test control file.
diff --git a/gas/listing.c b/gas/listing.c
index 6304aef..f86fb00 100644
--- a/gas/listing.c
+++ b/gas/listing.c
@@ -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 ();
}
diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp
index ee24c0d..af36b09 100644
--- a/gas/testsuite/gas/all/gas.exp
+++ b/gas/testsuite/gas/all/gas.exp
@@ -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
index 0000000..5426c91
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27384.d
@@ -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
index 0000000..2d5954f
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27384.err
@@ -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
index 0000000..6d831b0
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27384.s
@@ -0,0 +1,4 @@
+ .nop
+ .Psize f,-7
+ .nop
+