aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
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-14 18:33:24 +0200
commitcdc34b505796327b3eee9e97bc5f27ba71fd9e7a (patch)
tree479abea4f28b9b3d1593a4b360e307dde3210f8f /libgfortran
parent8d286dd118a5bd16f7ae0fb9dfcdcfd020bea803 (diff)
downloadgcc-cdc34b505796327b3eee9e97bc5f27ba71fd9e7a.zip
gcc-cdc34b505796327b3eee9e97bc5f27ba71fd9e7a.tar.gz
gcc-cdc34b505796327b3eee9e97bc5f27ba71fd9e7a.tar.bz2
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.
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog10
-rw-r--r--libgfortran/io/close.c8
2 files changed, 17 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 1cbdaf3..476a419 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,13 @@
+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 H.J. Lu <hongjiu.lu@intel.com>
+
+ * configure: Regenerated.
+
2020-05-14 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.
diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c
index 8aaa003..17e064b 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)