From 861ed9a339a1cdb15a76f36fb02b309163b87e85 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Sat, 10 Jan 2004 21:19:56 +0000 Subject: [PATCH] Cleanup ACL parsing, handle properly reload on sip with ACL git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1918 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- acl.c | 17 ++++++++++------- channels/chan_sip.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/acl.c b/acl.c index 98e2feab6b..6adc7f3deb 100755 --- a/acl.c +++ b/acl.c @@ -69,6 +69,7 @@ struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path) { struct ast_ha *ha = malloc(sizeof(struct ast_ha)); char *nm; + char tmp[256] = ""; struct ast_ha *prev = NULL; struct ast_ha *ret; ret = path; @@ -77,21 +78,23 @@ struct ast_ha *ast_append_ha(char *sense, char *stuff, struct ast_ha *path) path = path->next; } if (ha) { - char *stringp=NULL; - stringp=stuff; - strsep(&stringp, "/"); - nm = strsep(&stringp, "/"); + strncpy(tmp, stuff, sizeof(tmp) - 1); + nm = strchr(tmp, '/'); if (!nm) nm = "255.255.255.255"; - if (!inet_aton(stuff, &ha->netaddr)) { + else { + *nm = '\0'; + nm++; + } + if (!inet_aton(tmp, &ha->netaddr)) { ast_log(LOG_WARNING, "%s not a valid IP\n", stuff); free(ha); - return NULL; + return path; } if (!inet_aton(nm, &ha->netmask)) { ast_log(LOG_WARNING, "%s not a valid netmask\n", nm); free(ha); - return NULL; + return path; } ha->netaddr.s_addr &= ha->netmask.s_addr; if (!strncasecmp(sense, "p", 1)) { diff --git a/channels/chan_sip.c b/channels/chan_sip.c index d2eb678757..8e963951ae 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5791,11 +5791,13 @@ static struct sip_user *build_user(char *name, struct ast_variable *v) { struct sip_user *user; int format; + struct ast_ha *oldha = NULL; user = (struct sip_user *)malloc(sizeof(struct sip_user)); if (user) { memset(user, 0, sizeof(struct sip_user)); strncpy(user->name, name, sizeof(user->name)-1); - + oldha = user->ha; + user->ha = NULL; /* set the usage flag to a sane staring value*/ user->inUse = 0; user->outUse = 0; @@ -5888,6 +5890,8 @@ static struct sip_user *build_user(char *name, struct ast_variable *v) else if (strlen(user->md5secret)) strncpy(user->methods, "md5", sizeof(user->methods) - 1); } + if (oldha) + ast_free_ha(oldha); return user; } @@ -5918,6 +5922,7 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v) { struct sip_peer *peer; struct sip_peer *prev; + struct ast_ha *oldha = NULL; int maskfound=0; int format; int found=0; @@ -5955,6 +5960,8 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v) peer->addr.sin_port = htons(DEFAULT_SIP_PORT); peer->expiry = expiry; } + oldha = peer->ha; + peer->ha = NULL; peer->capability = capability; /* Assume can reinvite */ peer->canreinvite = REINVITE_INVITE; @@ -6075,6 +6082,8 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v) reg_source_db(peer); peer->delme = 0; } + if (oldha) + ast_free_ha(oldha); return peer; }