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.
This commit is contained in:
Thomas Koenig 2020-05-14 18:30:27 +02:00
parent 8d286dd118
commit cdc34b5057
4 changed files with 49 additions and 1 deletions

View File

@ -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.

View 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)

View File

@ -1,3 +1,16 @@
2020-05-14 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/95119
* testsuite/libgomp.fortran/close_errors_1.f90: New test.
2020-05-14 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.
2020-05-14 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c-c++-common/target-40.c: New test.
2020-05-14 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.

View File

@ -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