aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/read.c9
-rw-r--r--gas/testsuite/gas/all/gas.exp1
-rw-r--r--gas/testsuite/gas/all/pr27381.d4
-rw-r--r--gas/testsuite/gas/all/pr27381.err2
-rw-r--r--gas/testsuite/gas/all/pr27381.s1
6 files changed, 27 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 031bb54..2c7e533 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2021-02-09 Nick Clifton <nickc@redhat.com>
+
+ PR 27381
+ * read.c (s_incbin): Check that the file to be included is a
+ regular, non-directory file.
+ * testsuite/gas/all/pr27381.s: New test source file.
+ * testsuite/gas/all/pr27381.d: New test control file.
+ * testsuite/gas/all/pr27381.err: Expected error output for the new test.
+ * testsuite/gas/all/gas.exp: Run the new test.
+
2021-02-09 Alan Modra <amodra@gmail.com>
* Makefile.am (TARG_ENV_HFILES): Remove config/te-symbian.h.
diff --git a/gas/read.c b/gas/read.c
index 06ca7fb..ede811b 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -5909,7 +5909,16 @@ s_incbin (int x ATTRIBUTE_UNUSED)
if (binfile)
{
long file_len;
+ struct stat filestat;
+ if (fstat (fileno (binfile), &filestat) != 0
+ || ! S_ISREG (filestat.st_mode)
+ || S_ISDIR (filestat.st_mode))
+ {
+ as_bad (_("unable to include `%s'"), path);
+ goto done;
+ }
+
register_dependency (path);
/* Compute the length of the file. */
diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp
index af36b09..6a8491f 100644
--- a/gas/testsuite/gas/all/gas.exp
+++ b/gas/testsuite/gas/all/gas.exp
@@ -470,3 +470,4 @@ gas_test "pr23938.s" "" "" ".xstabs"
run_dump_test "nop"
run_dump_test "asciz"
run_dump_test "pr27384"
+run_dump_test "pr27381"
diff --git a/gas/testsuite/gas/all/pr27381.d b/gas/testsuite/gas/all/pr27381.d
new file mode 100644
index 0000000..13bc4d0
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27381.d
@@ -0,0 +1,4 @@
+#as:
+#error_output: pr27381.err
+# The TI targets do not support the .incbin directuve.
+#notarget: tic*-*-*
diff --git a/gas/testsuite/gas/all/pr27381.err b/gas/testsuite/gas/all/pr27381.err
new file mode 100644
index 0000000..f414210
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27381.err
@@ -0,0 +1,2 @@
+.*pr27381.s: Assembler messages:
+.*pr27381.s:1: Error: unable to include `/etc/'
diff --git a/gas/testsuite/gas/all/pr27381.s b/gas/testsuite/gas/all/pr27381.s
new file mode 100644
index 0000000..b75523f
--- /dev/null
+++ b/gas/testsuite/gas/all/pr27381.s
@@ -0,0 +1 @@
+.incbin "/etc/"