]> git.ipfire.org Git - thirdparty/gcc.git/commit
fortran: Restore interface to its previous state on error [PR48776]
authorMikael Morin <mikael@gcc.gnu.org>
Wed, 30 Aug 2023 12:18:56 +0000 (14:18 +0200)
committerMikael Morin <mikael@gcc.gnu.org>
Wed, 30 Aug 2023 12:20:05 +0000 (14:20 +0200)
commitd58150452976c4ca65ddc811fac78ef956fa96b0
tree416ad179572be1fe7560d2625dbf2428c031fdb9
parentcaa7a99a052929d5970677c5b639e1fa5166e334
fortran: Restore interface to its previous state on error [PR48776]

Keep memory of the content of the current interface body being parsed
and restore it to its previous state if it has been modified at the time
a parse attempt fails.

This fixes memory errors and random segmentation faults caused by
dangling symbol pointers kept in interfaces' linked lists of symbols.
If a parsing attempt fails and symbols are freed, they should also be
removed from the current interface linked list.

As the list of symbol is a linked list, and parsing only adds new
symbols to the head of the list, all that is needed to track the
previous content of the list is a pointer to its previous head.
This adds such a pointer, and the restoration of the list of symbols
to that pointer on error.

PR fortran/48776

gcc/fortran/ChangeLog:

* gfortran.h (gfc_drop_interface_elements_before): New prototype.
(gfc_current_interface_head): Return a reference to the pointer.
* interface.cc (gfc_current_interface_head): Ditto.
(free_interface_elements_until): New function, generalizing
gfc_free_interface.
(gfc_free_interface): Use free_interface_elements_until.
(gfc_drop_interface_elements_before): New function.
* parse.cc
(current_interface_ptr, previous_interface_head): New static variables.
(current_interface_valid_p, get_current_interface_ptr): New functions.
(decode_statement): Initialize previous_interface_head.
(reject_statement): Restore current interface pointer to point to
previous_interface_head.

gcc/testsuite/ChangeLog:

* gfortran.dg/interface_procedure_1.f90: New test.
gcc/fortran/gfortran.h
gcc/fortran/interface.cc
gcc/fortran/parse.cc
gcc/testsuite/gfortran.dg/interface_procedure_1.f90 [new file with mode: 0644]