From aee87d9c1665ca8823c7489bfc9900ff12e0e177 Mon Sep 17 00:00:00 2001 From: Marc Fournier Date: Tue, 12 May 2015 22:40:27 +0200 Subject: [PATCH] oconfig: fix oconfig_free to free all elements 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 | 2 -- src/liboconfig/oconfig.c | 11 +++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/java.c b/src/java.c index 83cd353f..10d837e6 100644 --- a/src/java.c +++ b/src/java.c @@ -3051,10 +3051,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) diff --git a/src/liboconfig/oconfig.c b/src/liboconfig/oconfig.c index 629775ab..181eadd2 100644 --- a/src/liboconfig/oconfig.c +++ b/src/liboconfig/oconfig.c @@ -187,7 +187,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; @@ -206,12 +206,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 */ -- 2.11.0