From: Arran Cudbard-Bell Date: Mon, 5 Jan 2015 01:19:25 +0000 (-0500) Subject: Alloc main config section before reading config file in case there are any sections... X-Git-Tag: release_3_0_7~353 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b690e82ffba72ec255d16d18cead0d0cef192a2b;p=thirdparty%2Ffreeradius-server.git Alloc main config section before reading config file in case there are any sections the server needs to add --- diff --git a/src/include/conffile.h b/src/include/conffile.h index f59e74708dd..ee49445aff6 100644 --- a/src/include/conffile.h +++ b/src/include/conffile.h @@ -167,7 +167,7 @@ int cf_item_parse(CONF_SECTION *cs, char const *name, int type, void *data, cha int cf_section_parse(CONF_SECTION *, void *base, CONF_PARSER const *variables); int cf_section_parse_pass2(CONF_SECTION *, void *base, CONF_PARSER const *variables); const CONF_PARSER *cf_section_parse_table(CONF_SECTION *cs); -CONF_SECTION *cf_file_read(char const *file); +int cf_file_read(CONF_SECTION *cs, char const *file); void cf_file_free(CONF_SECTION *cs); int cf_file_include(CONF_SECTION *cs, char const *file); diff --git a/src/main/client.c b/src/main/client.c index e4981e29f41..feb9513c777 100644 --- a/src/main/client.c +++ b/src/main/client.c @@ -1313,9 +1313,14 @@ RADCLIENT *client_read(char const *filename, int in_server, int flag) if (!filename) return NULL; - cs = cf_file_read(filename); + cs = cf_section_alloc(NULL, "main", NULL); if (!cs) return NULL; + if (cf_file_read(cs, filename) < 0) { + talloc_free(cs); + return NULL; + } + cs = cf_section_sub_find(cs, "client"); if (!cs) { ERROR("No \"client\" section found in client file"); diff --git a/src/main/conffile.c b/src/main/conffile.c index 4fc28ea5f01..a7cddd970c4 100644 --- a/src/main/conffile.c +++ b/src/main/conffile.c @@ -2498,17 +2498,13 @@ int cf_file_include(CONF_SECTION *cs, char const *filename) /* * Bootstrap a config file. */ -CONF_SECTION *cf_file_read(char const *filename) +int cf_file_read(CONF_SECTION *cs, char const *filename) { char *p; CONF_PAIR *cp; - CONF_SECTION *cs; - - cs = cf_section_alloc(NULL, "main", NULL); - if (!cs) return NULL; cp = cf_pair_alloc(cs, "confdir", filename, T_OP_SET, T_BARE_WORD, T_SINGLE_QUOTED_STRING); - if (!cp) return NULL; + if (!cp) return -1; p = strrchr(cp->value, FR_DIR_SEP); if (p) *p = '\0'; @@ -2517,12 +2513,9 @@ CONF_SECTION *cf_file_read(char const *filename) cp->item.lineno = -1; cf_item_add(cs, &(cp->item)); - if (cf_file_include(cs, filename) < 0) { - talloc_free(cs); - return NULL; - } + if (cf_file_include(cs, filename) < 0) return -1; - return cs; + return 0; } diff --git a/src/main/mainconfig.c b/src/main/mainconfig.c index bd0239ae69c..08a1eb889e7 100644 --- a/src/main/mainconfig.c +++ b/src/main/mainconfig.c @@ -785,8 +785,10 @@ do {\ /* Read the configuration file */ snprintf(buffer, sizeof(buffer), "%.200s/%.50s.conf", radius_dir, main_config.name); - if ((cs = cf_file_read(buffer)) == NULL) { + if (cf_file_read(cs, buffer) < 0) { ERROR("Errors reading or parsing %s", buffer); + talloc_free(cs); + return -1; } @@ -1035,11 +1037,15 @@ void main_config_hup(void) INFO("HUP - Re-reading configuration files"); + cs = cf_section_alloc(NULL, "main", NULL); + if (!cs) return; + /* Read the configuration file */ snprintf(buffer, sizeof(buffer), "%.200s/%.50s.conf", radius_dir, main_config.name); - if ((cs = cf_file_read(buffer)) == NULL) { + if (cf_file_read(cs, buffer) < 0) { ERROR("Failed to re-read or parse %s", buffer); + talloc_free(cs); return; } diff --git a/src/main/radmin.c b/src/main/radmin.c index ae66db1b6a3..8deb9db8f80 100644 --- a/src/main/radmin.c +++ b/src/main/radmin.c @@ -585,8 +585,10 @@ int main(int argc, char **argv) exit(64); } - cs = cf_file_read(buffer); - if (!cs) { + cs = cf_section_alloc(NULL, "main", NULL); + if (!cs) exit(1); + + if (cf_file_read(cs, buffer) < 0) { fprintf(stderr, "%s: Errors reading or parsing %s\n", progname, buffer); usage(1); } diff --git a/src/main/radwho.c b/src/main/radwho.c index e4a3f7fca78..302a404e604 100644 --- a/src/main/radwho.c +++ b/src/main/radwho.c @@ -326,9 +326,11 @@ int main(int argc, char **argv) memset(&main_config, 0, sizeof(main_config)); /* Read radiusd.conf */ + maincs = cf_section_alloc(NULL, "main", NULL); + if (!maincs) exit(1); + snprintf(buffer, sizeof(buffer), "%.200s/radiusd.conf", raddb_dir); - maincs = cf_file_read(buffer); - if (!maincs) { + if (cf_file_read(maincs, buffer) < 0) { fprintf(stderr, "%s: Error reading or parsing radiusd.conf\n", argv[0]); exit(1); }