Commit 3633bc27 by Thomas Koenig

Fixes a hang on an invalid ID in a WAIT statement.

gcc/fortran/ChangeLog:

2020-05-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/95191
	* libgfortran.h (libgfortran_error_codes): Add
	LIBERROR_BAD_WAIT_ID.

libgfortran/ChangeLog:

2020-05-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/95191
	* io/async.c (async_wait_id): Generate error if ID is higher
	than the highest current ID.
	* runtime/error.c (translate_error): Handle LIBERROR_BAD_WAIT_ID.

libgomp/ChangeLog:

2020-05-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR libfortran/95191
	* testsuite/libgomp.fortran/async_io_9.f90: New test.

(cherry picked from commit 8df7ee67f6fdc780e9453f2baa8d1bf62c000761)
parent b425be2c
...@@ -124,6 +124,7 @@ typedef enum ...@@ -124,6 +124,7 @@ typedef enum
LIBERROR_SHORT_RECORD, LIBERROR_SHORT_RECORD,
LIBERROR_CORRUPT_FILE, LIBERROR_CORRUPT_FILE,
LIBERROR_INQUIRE_INTERNAL_UNIT, /* Must be different from STAT_STOPPED_IMAGE. */ LIBERROR_INQUIRE_INTERNAL_UNIT, /* Must be different from STAT_STOPPED_IMAGE. */
LIBERROR_BAD_WAIT_ID,
LIBERROR_LAST /* Not a real error, the last error # + 1. */ LIBERROR_LAST /* Not a real error, the last error # + 1. */
} }
libgfortran_error_codes; libgfortran_error_codes;
......
...@@ -424,6 +424,13 @@ async_wait_id (st_parameter_common *cmp, async_unit *au, int i) ...@@ -424,6 +424,13 @@ async_wait_id (st_parameter_common *cmp, async_unit *au, int i)
} }
LOCK (&au->lock); LOCK (&au->lock);
if (i > au->id.high)
{
generate_error_common (cmp, LIBERROR_BAD_WAIT_ID, NULL);
UNLOCK (&au->lock);
return true;
}
NOTE ("Waiting for id %d", i); NOTE ("Waiting for id %d", i);
if (au->id.waiting < i) if (au->id.waiting < i)
au->id.waiting = i; au->id.waiting = i;
......
...@@ -660,6 +660,10 @@ translate_error (int code) ...@@ -660,6 +660,10 @@ translate_error (int code)
p = "Inquire statement identifies an internal file"; p = "Inquire statement identifies an internal file";
break; break;
case LIBERROR_BAD_WAIT_ID:
p = "Bad ID in WAIT statement";
break;
default: default:
p = "Unknown error code"; p = "Unknown error code";
break; break;
......
! { dg-do run }
! PR 95191 - this used to hang.
! Original test case by Bill Long.
program test
real a(10000)
integer my_id
integer bad_id
integer :: iostat
character (len=100) :: iomsg
data my_id /1/
data bad_id /2/
a = 1.
open (unit=10, file='test.dat', form='unformatted', &
& asynchronous='yes')
write (unit=10, asynchronous='yes', id=my_id) a
iomsg = ""
wait (unit=10, id=bad_id, iostat=iostat, iomsg=iomsg)
if (iostat == 0 .or. iomsg /= "Bad ID in WAIT statement") stop 1
close (unit=10, status='delete')
end program test
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment