aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-01-01 18:55:41 +0100
committerHarald Anlauf <anlauf@gmx.de>2021-01-01 18:55:41 +0100
commitd816b0c144d15e6570eb5b124b9f3ccbe3d40082 (patch)
tree92e08a0115ba67d320a8ddca8bca7d633f4f63fd /gcc
parent4b24d500f4ca5cefbeeca2a6924d1ebdc180b184 (diff)
downloadgcc-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')
-rw-r--r--gcc/fortran/class.c4
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;