Dear all,

happy New Year!

The testcase committed with the fix for PR93337 uncovered a latent issue
with an invalid read that was discovered with an ASAN instrumented compiler
but which could also be verified by running f951 under valgrind.

According to my gdb sessions the invalid read happens when processing a
statement that refers to a rejected declaration of a CLASS instance.
We simply should not try to look up the vtab entry in such cases.

All variations of the testcase gfortran.dg/pr93337.f90 that I tried on
x86_64-pc-linux-gnu with the patch below appeared to behave clean running
f951 under valgrind.

Regtested on x86_64-pc-linux-gnu.

OK for master?  Since the fix for PR93337 was applied to 9/10/11, I intend
to backport after suitable waiting time.

Thanks,
Harald


PR fortran/96381 - invalid read in gfc_find_derived_vtab

An invalid declaration of a CLASS instance can lead to an internal state
with inconsistent attributes during parsing that needs to be handled with
sufficient care when processing subsequent statements.  Avoid a lookup of
the vtab entry for such cases.

gcc/fortran/ChangeLog:

        * class.c (gfc_find_vtab): Add check on attribute is_class.

diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 5677d920239..783e4c7354b 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -2906,7 +2906,9 @@ gfc_find_vtab (gfc_typespec *ts)
     case BT_DERIVED:
       return gfc_find_derived_vtab (ts->u.derived);
     case BT_CLASS:
-      if (ts->u.derived->components && ts->u.derived->components->ts.u.derived)
+      if (ts->u.derived->attr.is_class
+	  && ts->u.derived->components
+	  && ts->u.derived->components->ts.u.derived)
 	return gfc_find_derived_vtab (ts->u.derived->components->ts.u.derived);
       else
 	return NULL;

Reply via email to