texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[6212] parsetexi fix memory leaks


From: Gavin D. Smith
Subject: [6212] parsetexi fix memory leaks
Date: Thu, 09 Apr 2015 13:15:44 +0000

Revision: 6212
          http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=6212
Author:   gavin
Date:     2015-04-09 13:15:43 +0000 (Thu, 09 Apr 2015)
Log Message:
-----------
parsetexi fix memory leaks

Modified Paths:
--------------
    trunk/parsetexi/def.c
    trunk/parsetexi/end_line.c
    trunk/parsetexi/parser.c
    trunk/parsetexi/tree.c
    trunk/parsetexi/tree.h

Modified: trunk/parsetexi/def.c
===================================================================
--- trunk/parsetexi/def.c       2015-04-09 11:50:36 UTC (rev 6211)
+++ trunk/parsetexi/def.c       2015-04-09 13:15:43 UTC (rev 6212)
@@ -393,6 +393,7 @@
               add_to_def_args_extra (def_args, "delimiter", e);
               p += len;
             }
+          destroy_element (arg);
         }
       else
         {

Modified: trunk/parsetexi/end_line.c
===================================================================
--- trunk/parsetexi/end_line.c  2015-04-09 11:50:36 UTC (rev 6211)
+++ trunk/parsetexi/end_line.c  2015-04-09 13:15:43 UTC (rev 6212)
@@ -1018,6 +1018,7 @@
       ELEMENT *end_elt;
 
       debug ("END COMMAND %s", end_command);
+      free (end_command);
 
       /* Reparent the "@end" element to be a child of the block element. */
       end_elt = pop_element_from_contents (current);
@@ -1041,7 +1042,12 @@
           if (close_preformatted_command (end_id))
             current = begin_preformatted (current);
         }
-      free (end_command);
+      else
+        {
+          /* The "@end" line does not appear in the final tree for a
+             conditional block. */
+          destroy_element_and_children (end_elt);
+        }
     } /* 3340 */
   else
     {

Modified: trunk/parsetexi/parser.c
===================================================================
--- trunk/parsetexi/parser.c    2015-04-09 11:50:36 UTC (rev 6211)
+++ trunk/parsetexi/parser.c    2015-04-09 13:15:43 UTC (rev 6212)
@@ -667,7 +667,7 @@
               popped = pop_element_from_contents (current);
               if (popped->cmd != end_cmd)
                 abort(); //error
-              destroy_element (popped);
+              destroy_element_and_children (popped);
 
               // abort until end of line, calling new_line
               debug ("CLOSED conditional %s", command_name(end_cmd));

Modified: trunk/parsetexi/tree.c
===================================================================
--- trunk/parsetexi/tree.c      2015-04-09 11:50:36 UTC (rev 6211)
+++ trunk/parsetexi/tree.c      2015-04-09 13:15:43 UTC (rev 6212)
@@ -58,6 +58,21 @@
   free (e);
 }
 
+/* Recursively destroy this element and all data in its descendants.
+   TODO: Also extra information. */
+void
+destroy_element_and_children (ELEMENT *e)
+{
+  int i;
+
+  for (i = 0; i < e->contents.number; i++)
+    destroy_element_and_children (e->contents.list[i]);
+  for (i = 0; i < e->args.number; i++)
+    destroy_element_and_children (e->args.list[i]);
+
+  destroy_element (e);
+}
+
 /* Make sure there is space for at least one more element. */
 static void
 reallocate_list (ELEMENT_LIST *list)

Modified: trunk/parsetexi/tree.h
===================================================================
--- trunk/parsetexi/tree.h      2015-04-09 11:50:36 UTC (rev 6211)
+++ trunk/parsetexi/tree.h      2015-04-09 13:15:43 UTC (rev 6212)
@@ -27,6 +27,7 @@
 ELEMENT *contents_child_by_index (ELEMENT *e, int index);
 ELEMENT *args_child_by_index (ELEMENT *e, int index);
 void destroy_element (ELEMENT *e);
+void destroy_element_and_children (ELEMENT *e);
 
 #define element_contents_number(e) ((e)->contents.number)
 #define element_args_number(e) ((e)->args.number)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]