public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch] Fortran: Avoid double-free with parse error (PR96041, PR93423)
@ 2020-09-12 21:00 Tobias Burnus
  2020-09-15  6:11 ` Early ping — " Tobias Burnus
  2020-09-16  7:58 ` Andre Vehreschild
  0 siblings, 2 replies; 5+ messages in thread
From: Tobias Burnus @ 2020-09-12 21:00 UTC (permalink / raw)
  To: fortran, gcc-patches; +Cc: Harald Anlauf

[-- Attachment #1: Type: text/plain, Size: 787 bytes --]

The testcase for PR93423 did a double free, which caused
an ICE. That's reported in PR96041.

Slightly frustrated by the FAIL in the testsuite,
I decided to debug and, hopefully, fix this.

The problem is related to putting the symtree
into a sub namespace of the symbol's ns. That's fixed up
by copying things around – except in the error case where
all those fixups are undone. Thus, when the symbol tree
is deleted, the parent's sym->formal->sym is also deleted,
causing an ICE in resolve_formal_arguments.

Hopefully, I got this all right...
I see still one memory leak for a symbol in module.c
according to valgrind, but I don't know whether it is
related to those symbols. (There are a lot of other leaks,
mostly related to polymorphism (vtab etc.).)

OK for the trunk?

Tobias


[-- Attachment #2: f-memleak.diff --]
[-- Type: text/x-patch, Size: 1052 bytes --]

Fortran: Avoid double-free with parse error (PR96041, PR93423)

gcc/fortran/

	PR fortran/96041
	PR fortran/93423
	* decl.c (gfc_match_submod_proc): Avoid later double-free
	in the error case.

 gcc/fortran/decl.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index c612b492f3e..326e6f5db7a 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -9819,6 +9819,15 @@ gfc_match_submod_proc (void)
 
   if (gfc_match_eos () != MATCH_YES)
     {
+      /* Unset st->n.sym. Note: in reject_statement (), the symbol changes are
+	 undone, such that the st->n.sym->formal points to the original symbol;
+	 if now this namespace is finalized, the formal namespace is freed,
+	 but it might be still needed in the parent namespace.  */
+      gfc_symtree *st = gfc_find_symtree (gfc_current_ns->sym_root, sym->name);
+      st->n.sym = NULL;
+      gfc_free_symbol (sym->tlink);
+      sym->tlink = NULL;
+      sym->refs--;
       gfc_syntax_error (ST_MODULE_PROC);
       return MATCH_ERROR;
     }

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-09-17 11:45 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-12 21:00 [Patch] Fortran: Avoid double-free with parse error (PR96041, PR93423) Tobias Burnus
2020-09-15  6:11 ` Early ping — " Tobias Burnus
2020-09-16  7:58 ` Andre Vehreschild
2020-09-16  8:35   ` Tobias Burnus
2020-09-17 11:45     ` Andre Vehreschild

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).