From: Thomas Koenig Date: Thu, 14 May 2020 16:30:27 +0000 (+0200) Subject: Add early return for invalid STATUS for close. X-Git-Tag: misc/first-auto-changelog-9~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1d34396c264ae15ba7492bd2b800c5764d92134;p=thirdparty%2Fgcc.git Add early return for invalid STATUS for close. 2020-05-14 Thomas Koenig PR libfortran/95119 * io/close.c (close_status): Add CLOSE_INVALID. (st_close): Return early on invalid STATUS parameter. 2020-05-14 Thomas Koenig 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) --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 946c9f0100b7..59e0fc522ef5 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2020-05-22 Thomas Koenig + + PR libfortran/95119 + * io/close.c (close_status): Add CLOSE_INVALID. + (st_close): Return early on invalid STATUS parameter. + 2020-04-19 Uroš Bizjak * config/fpu-387.h (local_feraiseexcept) [__SSE_MATH__]: diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c index 1e075ea96087..b5c855b7fb34 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 2926096bb7c3..29d398866794 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2020-05-22 Thomas Koenig + + PR libfortran/95119 + * testsuite/libgomp.fortran/close_errors_1.f90: New test. + 2020-04-13 Thomas Schwinge 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 index 000000000000..6edb7da4116f --- /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