diff options
author | Harald Anlauf <anlauf@gmx.de> | 2021-01-01 18:55:41 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2021-01-01 18:55:41 +0100 |
commit | d816b0c144d15e6570eb5b124b9f3ccbe3d40082 (patch) | |
tree | 92e08a0115ba67d320a8ddca8bca7d633f4f63fd /gcc/fortran/class.c | |
parent | 4b24d500f4ca5cefbeeca2a6924d1ebdc180b184 (diff) | |
download | gcc-d816b0c144d15e6570eb5b124b9f3ccbe3d40082.zip gcc-d816b0c144d15e6570eb5b124b9f3ccbe3d40082.tar.gz gcc-d816b0c144d15e6570eb5b124b9f3ccbe3d40082.tar.bz2 |
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.
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r-- | gcc/fortran/class.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index 5677d92..783e4c7 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; |