[gcc/devel/c++-modules] PR fortran/95104 - Segfault on a legal WAIT statement

Nathan Sidwell nathan@gcc.gnu.org
Wed Jun 10 16:47:32 GMT 2020


https://gcc.gnu.org/g:56f03cd12be26828788a27f6f3c250041a958e45

commit 56f03cd12be26828788a27f6f3c250041a958e45
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Tue May 26 23:29:52 2020 +0200

    PR fortran/95104 - Segfault on a legal WAIT statement
    
    Referencing a unit in a WAIT statement that has not been opened before
    resulted in a NULL pointer dereference.  Check for this condition.
    
    2020-05-26  Harald Anlauf  <anlauf@gmx.de>
    
    libgfortran/
            PR libfortran/95104
            * io/transfer.c (st_wait_async): Do not dereference NULL pointer.
    
    gcc/testsuite/
            PR libfortran/95104
            * gfortran.dg/pr95104.f90: New test.
    
    Co-Authored-By: Steven G. Kargl  <kargl@gcc.gnu.org>

Diff:
---
 gcc/testsuite/gfortran.dg/pr95104.f90 | 8 ++++++++
 libgfortran/io/transfer.c             | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gfortran.dg/pr95104.f90 b/gcc/testsuite/gfortran.dg/pr95104.f90
new file mode 100644
index 00000000000..20bdd910f46
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr95104.f90
@@ -0,0 +1,8 @@
+! { dg-do run }
+! PR libfortran/95104 - Segfault on a legal WAIT statement
+
+program test
+  wait (10, iostat=ios)
+  if (ios /= 0) stop 1
+  close (10)
+end program test
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index d071c1ce915..cd51679ff46 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -4500,7 +4500,7 @@ void
 st_wait_async (st_parameter_wait *wtp)
 {
   gfc_unit *u = find_unit (wtp->common.unit);
-  if (ASYNC_IO && u->au)
+  if (ASYNC_IO && u && u->au)
     {
       if (wtp->common.flags & IOPARM_WAIT_HAS_ID)
 	async_wait_id (&(wtp->common), u->au, *wtp->id);


More information about the Gcc-cvs mailing list