summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2020-05-14 18:30:27 +0200
committerThomas Koenig <tkoenig@gcc.gnu.org>2020-05-22 16:02:24 +0200
commit8275e0a6686b465d4d1717784e3e864305d37d02 (patch)
tree84555aec4199d215121d115b5baa9b6c94fb4987
parenta24d9b5bbb6a298ff4e55d731d5e436b0da9e38a (diff)
downloadgcc-8275e0a6686b465d4d1717784e3e864305d37d02.tar.gz
Add early return for invalid STATUS for close.
2020-05-14 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/95119 * io/close.c (close_status): Add CLOSE_INVALID. (st_close): Return early on invalid STATUS parameter. 2020-05-14 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/95119 * testsuite/libgomp.fortran/close_errors_1.f90: New test. (cherry picked from commit cdc34b505796327b3eee9e97bc5f27ba71fd9e7a) (cherry picked from commit d975519ad1066ed0397714c91aafadadb52a63dd)
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/close.c8
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.fortran/close_errors_1.f9019
4 files changed, 37 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index b7286d5ce08..0e81d162d55 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/95119
+ * io/close.c (close_status): Add CLOSE_INVALID.
+ (st_close): Return early on invalid STATUS parameter.
+
2020-05-07 Release Manager
* GCC 10.1.0 released.
diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c
index 8aaa00393e7..17e064ba4e8 100644
--- a/libgfortran/io/close.c
+++ b/libgfortran/io/close.c
@@ -31,7 +31,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#endif
typedef enum
-{ CLOSE_DELETE, CLOSE_KEEP, CLOSE_UNSPECIFIED }
+{ CLOSE_INVALID = - 1, CLOSE_DELETE, CLOSE_KEEP, CLOSE_UNSPECIFIED }
close_status;
static const st_option status_opt[] = {
@@ -61,6 +61,12 @@ st_close (st_parameter_close *clp)
find_option (&clp->common, clp->status, clp->status_len,
status_opt, "Bad STATUS parameter in CLOSE statement");
+ if (status == CLOSE_INVALID)
+ {
+ library_end ();
+ return;
+ }
+
u = find_unit (clp->common.unit);
if (ASYNC_IO && u && u->au)
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index fc7926be85e..3009669982a 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR libfortran/95119
+ * testsuite/libgomp.fortran/close_errors_1.f90: New test.
+
2020-05-07 Release Manager
* GCC 10.1.0 released.
diff --git a/libgomp/testsuite/libgomp.fortran/close_errors_1.f90 b/libgomp/testsuite/libgomp.fortran/close_errors_1.f90
new file mode 100644
index 00000000000..6edb7da4116
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/close_errors_1.f90
@@ -0,0 +1,19 @@
+! { dg-do run }
+! PR 95115 - this used to hang with -pthread. Original test case by
+! Bill Long.
+
+program test
+ character(len=16) my_status
+ character(len=1000) :: iomsg
+ open (unit=10, file='test.dat')
+ print *,42
+ write (10, *) 'weird'
+ rewind (10)
+ read (10, *) my_status
+ close (10)
+ open (unit=10, file='test.dat')
+ close (unit=10, status=my_status, iostat=ios, iomsg=iomsg)
+ if (ios == 0) stop 1
+ if (iomsg /= "Bad STATUS parameter in CLOSE statement") stop 2
+ close (10, status='delete')
+end program test