From: Sebastian Harl Date: Thu, 28 May 2009 09:15:41 +0000 (+0200) Subject: configfile.c: Fixed Include'ing empty files. X-Git-Tag: collectd-4.6.3~2 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=1b92a7aa5cb90a36380680d1ee4f68e87896e35f;p=collectd.git configfile.c: Fixed Include'ing empty files. When including empty files, a typo prevented that the "Include" child (of the config parse tree) was removed correctly, leaving behind garbage which in turn led to a segfault if the Include option was not the last element of the config file. Also, another Include option following the inclusion of an empty file used to be ignored. This has been fixed as well. --- diff --git a/src/configfile.c b/src/configfile.c index c929d009..0bb46e40 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -378,12 +378,12 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, temp = NULL; /* If (src->children_num == 0) the array size is decreased. If offset - * is _not_ the last element, (offset < (src->children_num - 1)), then + * is _not_ the last element, (offset < (dst->children_num - 1)), then * we need to move the trailing elements before resizing the array. */ - if ((src->children_num == 0) && (offset < (src->children_num - 1))) + if ((src->children_num == 0) && (offset < (dst->children_num - 1))) { - int nmemb = src->children_num - (offset + 1); - memmove (src->children + offset, src->children + offset + 1, + int nmemb = dst->children_num - (offset + 1); + memmove (dst->children + offset, dst->children + offset + 1, sizeof (oconfig_item_t) * nmemb); } @@ -415,7 +415,7 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, sizeof (oconfig_item_t) * nmemb); } - /* Last but not least: If there are new childrem, copy them to the + /* Last but not least: If there are new children, copy them to the * memory reserved for them. */ if (src->children_num > 0) { @@ -491,6 +491,9 @@ static int cf_include_all (oconfig_item_t *root, int depth) /* Now replace the i'th child in `root' with `new'. */ cf_ci_replace_child (root, new, i); + /* ... and go back to the new i'th child. */ + --i; + sfree (new->values); sfree (new); } /* for (i = 0; i < root->children_num; i++) */