Code

oconfig: fix oconfig_free to free all elements
authorMarc Fournier <marc.fournier@camptocamp.com>
Tue, 12 May 2015 20:40:27 +0000 (22:40 +0200)
committerMarc Fournier <marc.fournier@camptocamp.com>
Tue, 12 May 2015 20:40:27 +0000 (22:40 +0200)
The recursive nature of this function made it difficult to free the root
node of the config tree. Splitting it in 2 allows to work around this
problem.

src/java.c
src/liboconfig/oconfig.c

index d0423be9276445ae957df9d0f5f7bed2a2b58fbc..2f1efbf16194f6b4b344e66bb2540927f8d736a4 100644 (file)
@@ -3078,10 +3078,8 @@ static int cjni_init (void) /* {{{ */
 
   if (config_block != NULL)
   {
-
     cjni_config_perform (config_block);
     oconfig_free (config_block);
-    config_block = NULL;
   }
 
   if (jvm == NULL)
index 539c9d3533ec5b3a29e5bb32f0227f2e0f4ac910..bf21b90e92c2b93af7e12f92036faa5e730d4133 100644 (file)
@@ -195,7 +195,7 @@ oconfig_item_t *oconfig_clone (const oconfig_item_t *ci_orig)
   return (ci_copy);
 } /* oconfig_item_t *oconfig_clone */
 
-void oconfig_free (oconfig_item_t *ci)
+void oconfig_free_all (oconfig_item_t *ci)
 {
   int i;
 
@@ -214,12 +214,19 @@ void oconfig_free (oconfig_item_t *ci)
     free (ci->values);
 
   for (i = 0; i < ci->children_num; i++)
-    oconfig_free (ci->children + i);
+    oconfig_free_all (ci->children + i);
 
   if (ci->children != NULL)
     free (ci->children);
 }
 
+void oconfig_free (oconfig_item_t *ci)
+{
+  oconfig_free_all (ci);
+  free (ci);
+  ci = NULL;
+}
+
 /*
  * vim:shiftwidth=2:tabstop=8:softtabstop=2:fdm=marker
  */