]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add early return for invalid STATUS for close.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Thu, 14 May 2020 16:30:27 +0000 (18:30 +0200)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 22 May 2020 14:08:33 +0000 (16:08 +0200)
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)
(cherry picked from commit 8275e0a6686b465d4d1717784e3e864305d37d02)

libgfortran/ChangeLog
libgfortran/io/close.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/close_errors_1.f90 [new file with mode: 0644]

index 946c9f0100b7b2e62f5d78b3b2c35cb7031a52df..59e0fc522ef50ff2972fa4866f61818d748de9ce 100644 (file)
@@ -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-04-19  Uroš Bizjak  <ubizjak@gmail.com>
 
        * config/fpu-387.h (local_feraiseexcept) [__SSE_MATH__]:
index 1e075ea9608783c8ede62d6091b68b4a6914b3db..b5c855b7fb34c9027d333b02fa4a73fd3a379e78 100644 (file)
@@ -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)
index 2926096bb7c3e7d4ba6b3e6ef2c8ec9d92733096..29d39886679458a74e8f4106057c6e17ca03d281 100644 (file)
@@ -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-04-13  Thomas Schwinge  <thomas@codesourcery.com>
 
        PR libgomp/92843
diff --git a/libgomp/testsuite/libgomp.fortran/close_errors_1.f90 b/libgomp/testsuite/libgomp.fortran/close_errors_1.f90
new file mode 100644 (file)
index 0000000..6edb7da
--- /dev/null
@@ -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