From 1b92a7aa5cb90a36380680d1ee4f68e87896e35f Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Thu, 28 May 2009 11:15:41 +0200 Subject: [PATCH] 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. --- src/configfile.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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++) */ -- 2.30.2