From 879bd7aad916abc32b632840734a5d0b431ab981 Mon Sep 17 00:00:00 2001 From: Alexandr Anikin <may@telecom-service.ru> Date: Mon, 2 Dec 2013 18:12:57 +0000 Subject: [PATCH] Check and reject non-digits e164 values on peers and general sections in ooh323.conf Regenerate e164 endpoint list on reload ooh323 (issue ASTERISK-22901) Reported by: Cyril CONSTANTIN Patches: ASTERISK-22901.patch ........ Merged revisions 403288 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 403290 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403292 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- addons/chan_ooh323.c | 96 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 14 deletions(-) diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index f374a216bc..56a1b7b683 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -2487,11 +2487,23 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v, return NULL; } } else if (!strcasecmp(v->name, "e164")) { - if (!(peer->e164 = ast_strdup(v->value))) { - ast_log(LOG_ERROR, "Could not allocate memory for e164 of " + int valid = 1; + const char *tmp; + for(tmp = v->value; *tmp; tmp++) { + if (!isdigit(*tmp)) { + valid = 0; + break; + } + } + if (valid) { + if (!(peer->e164 = ast_strdup(v->value))) { + ast_log(LOG_ERROR, "Could not allocate memory for e164 of " "peer %s\n", name); - ooh323_delete_peer(peer); - return NULL; + ooh323_delete_peer(peer); + return NULL; + } + } else { + ast_log(LOG_ERROR, "Invalid e164: %s for peer %s\n", v->value, name); } } else if (!strcasecmp(v->name, "email")) { if (!(peer->email = ast_strdup(v->value))) { @@ -2622,6 +2634,9 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v, static int ooh323_do_reload(void) { + struct ooAliases * pNewAlias = NULL; + struct ooh323_peer *peer = NULL; + if (gH323Debug) { ast_verb(0, "--- ooh323_do_reload\n"); } @@ -2641,6 +2656,46 @@ static int ooh323_do_reload(void) ooGkClientStart(gH323ep.gkClient); } + /* Set aliases if any */ + if (gH323Debug) { + ast_verb(0, "updating local aliases\n"); + } + + for (pNewAlias = gAliasList; pNewAlias; pNewAlias = pNewAlias->next) { + switch (pNewAlias->type) { + case T_H225AliasAddress_h323_ID: + ooH323EpAddAliasH323ID(pNewAlias->value); + break; + case T_H225AliasAddress_dialedDigits: + ooH323EpAddAliasDialedDigits(pNewAlias->value); + break; + case T_H225AliasAddress_email_ID: + ooH323EpAddAliasEmailID(pNewAlias->value); + break; + default: + ; + } + } + + ast_mutex_lock(&peerl.lock); + peer = peerl.peers; + while (peer) { + if(peer->h323id) { + ooH323EpAddAliasH323ID(peer->h323id); + } + if(peer->email) { + ooH323EpAddAliasEmailID(peer->email); + } + if(peer->e164) { + ooH323EpAddAliasDialedDigits(peer->e164); + } + if(peer->url) { + ooH323EpAddAliasURLID(peer->url); + } + peer = peer->next; + } + ast_mutex_unlock(&peerl.lock); + if (gH323Debug) { ast_verb(0, "+++ ooh323_do_reload\n"); } @@ -2724,6 +2779,7 @@ int reload_config(int reload) free(prev); } gAliasList = NULL; + ooH323EpClearAllAliases(); } /* Inintialize everything to default */ @@ -2840,17 +2896,29 @@ int reload_config(int reload) gAliasList = pNewAlias; pNewAlias = NULL; } else if (!strcasecmp(v->name, "e164")) { - pNewAlias = ast_calloc(1, sizeof(struct ooAliases)); - if (!pNewAlias) { - ast_log(LOG_ERROR, "Failed to allocate memory for e164 alias\n"); - ast_config_destroy(cfg); - return 1; + int valid = 1; + const char *tmp; + for(tmp = v->value; *tmp; tmp++) { + if (!isdigit(*tmp)) { + valid = 0; + break; + } + } + if (valid) { + pNewAlias = ast_calloc(1, sizeof(struct ooAliases)); + if (!pNewAlias) { + ast_log(LOG_ERROR, "Failed to allocate memory for e164 alias\n"); + ast_config_destroy(cfg); + return 1; + } + pNewAlias->type = T_H225AliasAddress_dialedDigits; + pNewAlias->value = strdup(v->value); + pNewAlias->next = gAliasList; + gAliasList = pNewAlias; + pNewAlias = NULL; + } else { + ast_log(LOG_ERROR, "Invalid e164: %s\n", v->value); } - pNewAlias->type = T_H225AliasAddress_dialedDigits; - pNewAlias->value = strdup(v->value); - pNewAlias->next = gAliasList; - gAliasList = pNewAlias; - pNewAlias = NULL; } else if (!strcasecmp(v->name, "email")) { pNewAlias = ast_calloc(1, sizeof(struct ooAliases)); if (!pNewAlias) { -- GitLab