https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48776

--- Comment #9 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Mikael Morin <mik...@gcc.gnu.org>:

https://gcc.gnu.org/g:d58150452976c4ca65ddc811fac78ef956fa96b0

commit r14-3572-gd58150452976c4ca65ddc811fac78ef956fa96b0
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Aug 30 14:18:56 2023 +0200

    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.

Reply via email to