If a typo is found in a config file, we previous continued on with what was already loaded.

We do not want to do this (see bug below for details).

This makes it so that if a [ is found without a ], the entire config will fail, and nothing in it will be loaded.

Isue #10690.


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@92696 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Jason Parker 18 years ago
parent 1209386fe7
commit 8771f23fff

@ -2710,6 +2710,56 @@ static struct ast_cli_entry cli_h323[] = {
show_tokens_usage },
};
static void delete_users(void)
{
int pruned = 0;
/* Delete all users */
ASTOBJ_CONTAINER_WRLOCK(&userl);
ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
++pruned;
ASTOBJ_UNLOCK(iterator);
} while (0) );
if (pruned) {
ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user);
}
ASTOBJ_CONTAINER_UNLOCK(&userl);
ASTOBJ_CONTAINER_WRLOCK(&peerl);
ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
ASTOBJ_UNLOCK(iterator);
} while (0) );
ASTOBJ_CONTAINER_UNLOCK(&peerl);
}
static void delete_aliases(void)
{
int pruned = 0;
/* Delete all aliases */
ASTOBJ_CONTAINER_WRLOCK(&aliasl);
ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
++pruned;
ASTOBJ_UNLOCK(iterator);
} while (0) );
if (pruned) {
ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias);
}
ASTOBJ_CONTAINER_UNLOCK(&aliasl);
}
static void prune_peers(void)
{
/* Prune peers who still are supposed to be deleted */
ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
}
static int reload_config(int is_reload)
{
int format;
@ -2733,6 +2783,12 @@ static int reload_config(int is_reload)
return 1;
}
if (is_reload) {
delete_users();
delete_aliases();
prune_peers();
}
/* fire up the H.323 Endpoint */
if (!h323_end_point_exist()) {
h323_end_point_create();
@ -2923,56 +2979,6 @@ static int reload_config(int is_reload)
return 0;
}
static void delete_users(void)
{
int pruned = 0;
/* Delete all users */
ASTOBJ_CONTAINER_WRLOCK(&userl);
ASTOBJ_CONTAINER_TRAVERSE(&userl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
++pruned;
ASTOBJ_UNLOCK(iterator);
} while (0) );
if (pruned) {
ASTOBJ_CONTAINER_PRUNE_MARKED(&userl, oh323_destroy_user);
}
ASTOBJ_CONTAINER_UNLOCK(&userl);
ASTOBJ_CONTAINER_WRLOCK(&peerl);
ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
ASTOBJ_UNLOCK(iterator);
} while (0) );
ASTOBJ_CONTAINER_UNLOCK(&peerl);
}
static void delete_aliases(void)
{
int pruned = 0;
/* Delete all aliases */
ASTOBJ_CONTAINER_WRLOCK(&aliasl);
ASTOBJ_CONTAINER_TRAVERSE(&aliasl, 1, do {
ASTOBJ_RDLOCK(iterator);
ASTOBJ_MARK(iterator);
++pruned;
ASTOBJ_UNLOCK(iterator);
} while (0) );
if (pruned) {
ASTOBJ_CONTAINER_PRUNE_MARKED(&aliasl, oh323_destroy_alias);
}
ASTOBJ_CONTAINER_UNLOCK(&aliasl);
}
static void prune_peers(void)
{
/* Prune peers who still are supposed to be deleted */
ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
}
static int h323_reload(int fd, int argc, char *argv[])
{
ast_mutex_lock(&h323_reload_lock);
@ -2988,9 +2994,6 @@ static int h323_reload(int fd, int argc, char *argv[])
static int h323_do_reload(void)
{
delete_users();
delete_aliases();
prune_peers();
reload_config(1);
return 0;
}

@ -9534,6 +9534,20 @@ static void set_timing(void)
#endif
}
static void set_config_destroy(void)
{
strcpy(accountcode, "");
strcpy(language, "");
strcpy(mohinterpret, "default");
strcpy(mohsuggest, "");
amaflags = 0;
delayreject = 0;
ast_clear_flag((&globalflags), IAX_NOTRANSFER);
ast_clear_flag((&globalflags), IAX_TRANSFERMEDIA);
ast_clear_flag((&globalflags), IAX_USEJITTERBUF);
ast_clear_flag((&globalflags), IAX_FORCEJITTERBUF);
delete_users();
}
/*! \brief Load configuration */
static int set_config(char *config_file, int reload)
@ -9561,6 +9575,10 @@ static int set_config(char *config_file, int reload)
return -1;
}
if (reload) {
set_config_destroy();
}
/* Reset global codec prefs */
memset(&prefs, 0 , sizeof(struct ast_codec_pref));
@ -9886,7 +9904,7 @@ static int set_config(char *config_file, int reload)
}
ast_config_destroy(cfg);
set_timing();
return capability;
return 1;
}
static void poke_all_peers(void)
@ -9905,26 +9923,16 @@ static int reload_config(void)
char *config = "iax.conf";
struct iax2_registry *reg;
strcpy(accountcode, "");
strcpy(language, "");
strcpy(mohinterpret, "default");
strcpy(mohsuggest, "");
amaflags = 0;
delayreject = 0;
ast_clear_flag((&globalflags), IAX_NOTRANSFER);
ast_clear_flag((&globalflags), IAX_TRANSFERMEDIA);
ast_clear_flag((&globalflags), IAX_USEJITTERBUF);
ast_clear_flag((&globalflags), IAX_FORCEJITTERBUF);
delete_users();
set_config(config, 1);
prune_peers();
prune_users();
AST_LIST_LOCK(&registrations);
AST_LIST_TRAVERSE(&registrations, reg, entry)
iax2_do_register(reg);
AST_LIST_UNLOCK(&registrations);
/* Qualify hosts, too */
poke_all_peers();
if (set_config(config, 1) > 0) {
prune_peers();
prune_users();
AST_LIST_LOCK(&registrations);
AST_LIST_TRAVERSE(&registrations, reg, entry)
iax2_do_register(reg);
AST_LIST_UNLOCK(&registrations);
/* Qualify hosts, too */
poke_all_peers();
}
reload_firmware(0);
iax_provision_reload();

@ -16660,6 +16660,36 @@ static int reload_config(enum channelreloadreason reason)
return -1;
}
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- SIP reload started\n");
clear_realm_authentication(authl);
clear_sip_domains();
authl = NULL;
/* First, destroy all outstanding registry calls */
/* This is needed, since otherwise active registry entries will not be destroyed */
ASTOBJ_CONTAINER_TRAVERSE(&regl, 1, do {
ASTOBJ_RDLOCK(iterator);
if (iterator->call) {
if (option_debug > 2)
ast_log(LOG_DEBUG, "Destroying active SIP dialog for registry %s@%s\n", iterator->username, iterator->hostname);
/* This will also remove references to the registry */
sip_destroy(iterator->call);
}
ASTOBJ_UNLOCK(iterator);
} while(0));
/* Then, actually destroy users and registry */
ASTOBJ_CONTAINER_DESTROYALL(&userl, sip_destroy_user);
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- Done destroying user list\n");
ASTOBJ_CONTAINER_DESTROYALL(&regl, sip_registry_destroy);
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- Done destroying registry list\n");
ASTOBJ_CONTAINER_MARKALL(&peerl);
/* Initialize copy of current global_regcontext for later use in removing stale contexts */
ast_copy_string(oldcontexts, global_regcontext, sizeof(oldcontexts));
oldregcontext = oldcontexts;
@ -17668,35 +17698,6 @@ static void sip_send_all_registers(void)
/*! \brief Reload module */
static int sip_do_reload(enum channelreloadreason reason)
{
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- SIP reload started\n");
clear_realm_authentication(authl);
clear_sip_domains();
authl = NULL;
/* First, destroy all outstanding registry calls */
/* This is needed, since otherwise active registry entries will not be destroyed */
ASTOBJ_CONTAINER_TRAVERSE(&regl, 1, do {
ASTOBJ_RDLOCK(iterator);
if (iterator->call) {
if (option_debug > 2)
ast_log(LOG_DEBUG, "Destroying active SIP dialog for registry %s@%s\n", iterator->username, iterator->hostname);
/* This will also remove references to the registry */
sip_destroy(iterator->call);
}
ASTOBJ_UNLOCK(iterator);
} while(0));
/* Then, actually destroy users and registry */
ASTOBJ_CONTAINER_DESTROYALL(&userl, sip_destroy_user);
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- Done destroying user list\n");
ASTOBJ_CONTAINER_DESTROYALL(&regl, sip_registry_destroy);
if (option_debug > 3)
ast_log(LOG_DEBUG, "--------------- Done destroying registry list\n");
ASTOBJ_CONTAINER_MARKALL(&peerl);
reload_config(reason);
/* Prune peers who still are supposed to be deleted */

@ -745,7 +745,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
if(!ast_strlen_zero(exec_file))
unlink(exec_file);
if(!do_include)
return 0;
return -1;
} else {
ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",

Loading…
Cancel
Save