From: Tilghman Lesher Date: Thu, 19 Apr 2007 02:30:18 +0000 (+0000) Subject: Bug 9557 - Specifying the GetVar AMI action without a Channel parameter can X-Git-Tag: 1.2.18~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e4467b3837f0c71ad4e3c8412a0f9256a342c456;p=thirdparty%2Fasterisk.git Bug 9557 - Specifying the GetVar AMI action without a Channel parameter can cause Asterisk to crash. The reason this needs to be fixed in the functions instead of in AMI is because Channel can legitimately be NULL, such as when retrieving global variables. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@61680 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 264c404dd5..374d131337 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -42,6 +42,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { + if (!chan) + return ""; + if (!strncasecmp("all", data, 3)) { snprintf(buf, len, "\"%s\" <%s>", chan->cid.cid_name ? chan->cid.cid_name : "", chan->cid.cid_num ? chan->cid.cid_num : ""); } else if (!strncasecmp("name", data, 4)) { @@ -73,9 +76,9 @@ static char *callerid_read(struct ast_channel *chan, char *cmd, char *data, char static void callerid_write(struct ast_channel *chan, char *cmd, char *data, const char *value) { - if (!value) + if (!value || !chan) return; - + if (!strncasecmp("all", data, 3)) { char name[256]; char num[256]; diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c index fdd241894b..5ff3ffcf9f 100644 --- a/funcs/func_cdr.c +++ b/funcs/func_cdr.c @@ -44,7 +44,7 @@ static char *builtin_function_cdr_read(struct ast_channel *chan, char *cmd, char int argc; char *argv[2]; int recursive = 0; - struct ast_cdr *cdr = chan->cdr; + struct ast_cdr *cdr = chan ? chan->cdr : NULL; if (ast_strlen_zero(data)) return NULL; @@ -78,9 +78,9 @@ static void builtin_function_cdr_write(struct ast_channel *chan, char *cmd, char char *argv[2]; int recursive = 0; - if (ast_strlen_zero(data) || !value) + if (ast_strlen_zero(data) || !value || !chan) return; - + mydata = ast_strdupa(data); argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0])); diff --git a/funcs/func_groupcount.c b/funcs/func_groupcount.c index 0f07d83277..87bcdf4f5e 100644 --- a/funcs/func_groupcount.c +++ b/funcs/func_groupcount.c @@ -149,6 +149,9 @@ static char *group_list_function_read(struct ast_channel *chan, char *cmd, char char tmp1[1024] = ""; char tmp2[1024] = ""; + if (!chan) + return ""; + headp=&chan->varshead; AST_LIST_TRAVERSE(headp,current,entries) { if (!strncmp(ast_var_name(current), GROUP_CATEGORY_PREFIX "_", strlen(GROUP_CATEGORY_PREFIX) + 1)) { diff --git a/funcs/func_language.c b/funcs/func_language.c index ea829a2f44..eef732326e 100644 --- a/funcs/func_language.c +++ b/funcs/func_language.c @@ -36,14 +36,14 @@ static char *builtin_function_language_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { - ast_copy_string(buf, chan->language, len); + ast_copy_string(buf, chan ? chan->language : "", len); return buf; } static void builtin_function_language_write(struct ast_channel *chan, char *cmd, char *data, const char *value) { - if (value) + if (chan && value) ast_copy_string(chan->language, value, sizeof(chan->language)); } diff --git a/funcs/func_moh.c b/funcs/func_moh.c index 25aa73af7d..203a4332dc 100644 --- a/funcs/func_moh.c +++ b/funcs/func_moh.c @@ -32,14 +32,15 @@ static char *function_moh_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { - ast_copy_string(buf, chan->musicclass, len); + ast_copy_string(buf, chan ? chan->musicclass : "", len); return buf; } static void function_moh_write(struct ast_channel *chan, char *cmd, char *data, const char *value) { - ast_copy_string(chan->musicclass, value, sizeof(chan->musicclass)); + if (chan) + ast_copy_string(chan->musicclass, value, sizeof(chan->musicclass)); } #ifndef BUILTIN_FUNC diff --git a/funcs/func_timeout.c b/funcs/func_timeout.c index 5983617aa6..95490594e8 100644 --- a/funcs/func_timeout.c +++ b/funcs/func_timeout.c @@ -42,6 +42,9 @@ static char *builtin_function_timeout_read(struct ast_channel *chan, char *cmd, { time_t myt; + if (!chan) + return ""; + if (!data) { ast_log(LOG_ERROR, "Must specify type of timeout to get.\n"); return NULL; @@ -86,6 +89,9 @@ static void builtin_function_timeout_write(struct ast_channel *chan, char *cmd, char timestr[64]; struct tm myt; + if (!chan) + return; + if (!data) { ast_log(LOG_ERROR, "Must specify type of timeout to set.\n"); return;