summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_agent.c14
-rw-r--r--channels/chan_iax2.c48
-rw-r--r--channels/chan_sip.c79
3 files changed, 105 insertions, 36 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 94a6965e4..68652b1e7 100644
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -329,6 +329,10 @@ static struct agent_pvt *add_agent(char *agent, int pending)
struct agent_pvt *p, *prev;
parse = ast_strdupa(agent);
+ if (!parse) {
+ ast_log(LOG_ERROR, "Out of memory!\n");
+ return NULL;
+ }
/* Extract username (agt), password and name from agent (args). */
AST_NONSTANDARD_APP_ARGS(args, parse, ',');
@@ -1763,7 +1767,11 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode)
LOCAL_USER_ADD(u);
- parse = ast_strdupa(data);
+ if (!(parse = ast_strdupa(data))) {
+ ast_log(LOG_ERROR, "Out of memory!\n");
+ LOCAL_USER_REMOVE(u);
+ return -1;
+ }
AST_STANDARD_APP_ARGS(args, parse);
@@ -2503,6 +2511,10 @@ static char *function_agent(struct ast_channel *chan, char *cmd, char *data, cha
}
item = ast_strdupa(data);
+ if (!item) {
+ ast_log(LOG_ERROR, "Out of memory!\n");
+ return buf;
+ }
agentid = strsep(&item, ":");
if (!item)
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 30e010b0c..6238366c8 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2784,10 +2784,12 @@ static int create_addr(const char *peername, struct sockaddr_in *sin, struct cre
char *key = NULL;
family = ast_strdupa(peer->dbsecret);
- key = strchr(family, '/');
- if (key)
- *key++ = '\0';
- if (!key || ast_db_get(family, key, cai->secret, sizeof(cai->secret))) {
+ if (family) {
+ key = strchr(family, '/');
+ if (key)
+ *key++ = '\0';
+ }
+ if (!family || !key || ast_db_get(family, key, cai->secret, sizeof(cai->secret))) {
ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", peer->dbsecret);
if (ast_test_flag(peer, IAX_TEMPONLY))
destroy_peer(peer);
@@ -3904,8 +3906,9 @@ static int decrypt_frame(int callno, struct ast_iax2_full_hdr *fh, struct ast_fr
unsigned char digest[16];
char *tmppw, *stringp;
- stringp = ast_strdupa(iaxs[callno]->secret);
- while ((tmppw = strsep(&stringp, ";"))) {
+ tmppw = ast_strdupa(iaxs[callno]->secret);
+ stringp = tmppw;
+ while((tmppw = strsep(&stringp, ";"))) {
MD5Init(&md5);
MD5Update(&md5, (unsigned char *)iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
MD5Update(&md5, (unsigned char *)tmppw, strlen(tmppw));
@@ -4852,10 +4855,14 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
if (!ast_strlen_zero(user->dbsecret)) {
char *family, *key=NULL;
family = ast_strdupa(user->dbsecret);
- key = strchr(family, '/');
- if (key)
- *key++ = '\0';
- if (!key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret))) {
+ if (family) {
+ key = strchr(family, '/');
+ if (key) {
+ *key = '\0';
+ key++;
+ }
+ }
+ if (!family || !key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret))) {
ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", user->dbsecret);
if (ast_test_flag(user, IAX_TEMPONLY)) {
destroy_user(user);
@@ -4961,8 +4968,9 @@ static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies)
unsigned char digest[16];
char *tmppw, *stringp;
- stringp = ast_strdupa(p->secret);
- while ((tmppw = strsep(&stringp, ";"))) {
+ tmppw = ast_strdupa(p->secret);
+ stringp = tmppw;
+ while((tmppw = strsep(&stringp, ";"))) {
MD5Init(&md5);
MD5Update(&md5, (unsigned char *)p->challenge, strlen(p->challenge));
MD5Update(&md5, (unsigned char *)tmppw, strlen(tmppw));
@@ -5090,8 +5098,9 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
unsigned char digest[16];
char *tmppw, *stringp;
- stringp = ast_strdupa(p->secret);
- while ((tmppw = strsep(&stringp, ";"))) {
+ tmppw = ast_strdupa(p->secret);
+ stringp = tmppw;
+ while((tmppw = strsep(&stringp, ";"))) {
MD5Init(&md5);
MD5Update(&md5, (unsigned char *)iaxs[callno]->challenge, strlen(iaxs[callno]->challenge));
MD5Update(&md5, (unsigned char *)tmppw, strlen(tmppw));
@@ -8025,6 +8034,10 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr)
char *portstr;
tmp = ast_strdupa(srcaddr);
+ if (!tmp) {
+ ast_log(LOG_WARNING, "Out of memory!\n");
+ return -1;
+ }
addr = strsep(&tmp, ":");
portstr = tmp;
@@ -8322,7 +8335,7 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in
user->ha = ast_append_ha(v->name, v->value, user->ha);
} else if (!strcasecmp(v->name, "setvar")) {
varname = ast_strdupa(v->value);
- if ((varval = strchr(varname,'='))) {
+ if (varname && (varval = strchr(varname,'='))) {
*varval = '\0';
varval++;
if((tmpvar = ast_variable_new(varname, varval))) {
@@ -9161,7 +9174,10 @@ static char *function_iaxpeer(struct ast_channel *chan, char *cmd, char *data, c
char *peername, *colname;
char iabuf[INET_ADDRSTRLEN];
- peername = ast_strdupa(data);
+ if (!(peername = ast_strdupa(data))) {
+ ast_log(LOG_ERROR, "Memory Error!\n");
+ return ret;
+ }
/* if our channel, return the IP address of the endpoint of current channel */
if (!strcmp(peername,"CURRENTCHANNEL")) {
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 761e92a02..fd78084b1 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1860,9 +1860,12 @@ static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer)
char *tmpcall;
char *c;
tmpcall = ast_strdupa(r->callid);
- if ((c = strchr(tmpcall, '@'))) {
- *c = '\0';
- ast_string_field_build(r, callid, "%s@%s", tmpcall, peer->fromdomain);
+ if (tmpcall) {
+ c = strchr(tmpcall, '@');
+ if (c) {
+ *c = '\0';
+ ast_string_field_build(r, callid, "%s@%s", tmpcall, peer->fromdomain);
+ }
}
}
if (ast_strlen_zero(r->tohost)) {
@@ -7054,8 +7057,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
if ((c = strchr(of, ':')))
*c = '\0';
tmp = ast_strdupa(of);
- ast_shrink_phone_number(tmp);
- ast_string_field_set(p, cid_num, tmp);
+ if (tmp) {
+ ast_shrink_phone_number(tmp);
+ ast_string_field_set(p, cid_num, tmp);
+ } else {
+ ast_string_field_set(p, cid_num, of);
+ }
}
if (ast_strlen_zero(of))
return 0;
@@ -7080,8 +7087,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
if (*calleridname)
ast_string_field_set(p, cid_name, calleridname);
tmp = ast_strdupa(rpid_num);
- ast_shrink_phone_number(tmp);
- ast_string_field_set(p, cid_num, tmp);
+ if (tmp) {
+ ast_shrink_phone_number(tmp);
+ ast_string_field_set(p, cid_num, tmp);
+ } else {
+ ast_string_field_set(p, cid_num, rpid_num);
+ }
}
if (p->rtp) {
@@ -7108,8 +7119,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
ast_string_field_set(p, context, user->context);
if (!ast_strlen_zero(user->cid_num) && !ast_strlen_zero(p->cid_num)) {
char *tmp = ast_strdupa(user->cid_num);
- ast_shrink_phone_number(tmp);
- ast_string_field_set(p, cid_num, tmp);
+ if (tmp) {
+ ast_shrink_phone_number(tmp);
+ ast_string_field_set(p, cid_num, tmp);
+ } else {
+ ast_string_field_set(p, cid_num, user->cid_num);
+ }
}
if (!ast_strlen_zero(user->cid_name) && !ast_strlen_zero(p->cid_num))
ast_string_field_set(p, cid_name, user->cid_name);
@@ -7171,8 +7186,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
char *tmp = ast_strdupa(rpid_num);
if (*calleridname)
ast_string_field_set(p, cid_name, calleridname);
- ast_shrink_phone_number(tmp);
- ast_string_field_set(p, cid_num, tmp);
+ if (tmp) {
+ ast_shrink_phone_number(tmp);
+ ast_string_field_set(p, cid_num, tmp);
+ } else {
+ ast_string_field_set(p, cid_num, rpid_num);
+ }
}
if (p->rtp) {
ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
@@ -7217,8 +7236,12 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
}
if (!ast_strlen_zero(peer->cid_num) && !ast_strlen_zero(p->cid_num)) {
char *tmp = ast_strdupa(peer->cid_num);
- ast_shrink_phone_number(tmp);
- ast_string_field_set(p, cid_num, tmp);
+ if (tmp) {
+ ast_shrink_phone_number(tmp);
+ ast_string_field_set(p, cid_num, tmp);
+ } else {
+ ast_string_field_set(p, cid_num, peer->cid_num);
+ }
}
if (!ast_strlen_zero(peer->cid_name) && !ast_strlen_zero(p->cid_name))
ast_string_field_set(p, cid_name, peer->cid_name);
@@ -9269,7 +9292,10 @@ static char *function_sippeer(struct ast_channel *chan, char *cmd, char *data, c
char *peername, *colname;
char iabuf[INET_ADDRSTRLEN];
- peername = ast_strdupa(data);
+ if (!(peername = ast_strdupa(data))) {
+ ast_log(LOG_ERROR, "Memory Error!\n");
+ return ret;
+ }
if ((colname = strchr(peername, ':'))) {
*colname = '\0';
@@ -11927,7 +11953,7 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
ast_copy_string(user->subscribecontext, v->value, sizeof(user->subscribecontext));
} else if (!strcasecmp(v->name, "setvar")) {
varname = ast_strdupa(v->value);
- if ((varval = strchr(varname,'='))) {
+ if (varname && (varval = strchr(varname,'='))) {
*varval = '\0';
varval++;
if ((tmpvar = ast_variable_new(varname, varval))) {
@@ -12231,7 +12257,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
} else if (!strcasecmp(v->name, "setvar")) {
/* Set peer channel variable */
varname = ast_strdupa(v->value);
- if ((varval = strchr(varname,'='))) {
+ if (varname && (varval = strchr(varname,'='))) {
*varval = '\0';
varval++;
if ((tmpvar = ast_variable_new(varname, varval))) {
@@ -12822,6 +12848,10 @@ static int sip_sipredirect(struct sip_pvt *p, const char *dest)
char tmp[80];
cdest = ast_strdupa(dest);
+ if (!cdest) {
+ ast_log(LOG_ERROR, "Problem allocating the memory\n");
+ return 0;
+ }
extension = strsep(&cdest, "@");
host = strsep(&cdest, ":");
port = strsep(&cdest, ":");
@@ -12839,17 +12869,28 @@ static int sip_sipredirect(struct sip_pvt *p, const char *dest)
return 0;
}
if ((localtmp = strstr(tmp, "sip:")) && (localtmp = strchr(localtmp, '@'))) {
- char lhost[80] = "", lport[80] = "";
+ char lhost[80], lport[80];
+ memset(lhost, 0, sizeof(lhost));
+ memset(lport, 0, sizeof(lport));
localtmp++;
/* This is okey because lhost and lport are as big as tmp */
sscanf(localtmp, "%[^<>:; ]:%[^<>:; ]", lhost, lport);
- if (ast_strlen_zero(lhost)) {
+ if (!strlen(lhost)) {
ast_log(LOG_ERROR, "Can't find the host address\n");
return 0;
}
host = ast_strdupa(lhost);
- if (!ast_strlen_zero(lport))
+ if (!host) {
+ ast_log(LOG_ERROR, "Problem allocating the memory\n");
+ return 0;
+ }
+ if (!ast_strlen_zero(lport)) {
port = ast_strdupa(lport);
+ if (!port) {
+ ast_log(LOG_ERROR, "Problem allocating the memory\n");
+ return 0;
+ }
+ }
}
}