From: Marc Fournier Date: Tue, 12 May 2015 20:40:27 +0000 (+0200) Subject: oconfig: fix oconfig_free to free all elements X-Git-Tag: collectd-5.5.0~12^2~4^2~6 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=aee87d9c1665ca8823c7489bfc9900ff12e0e177 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. --- 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 */