Fix dialplan function NULL channel safety issues
authorCorey Farrell <git@cfware.com>
Thu, 27 Mar 2014 19:21:44 +0000 (19:21 +0000)
committerCorey Farrell <git@cfware.com>
Thu, 27 Mar 2014 19:21:44 +0000 (19:21 +0000)
(closes issue ASTERISK-23391)
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/3386/
........

Merged revisions 411313 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 411314 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 411315 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@411328 65c4cc65-6c06-0410-ace0-fbb531ad65f3

31 files changed:
apps/app_jack.c
apps/app_speech_utils.c
apps/app_stack.c
apps/app_voicemail.c
apps/confbridge/conf_config_parser.c
channels/chan_iax2.c
channels/chan_sip.c
channels/pjsip/dialplan_functions.c
funcs/func_blacklist.c
funcs/func_callcompletion.c
funcs/func_callerid.c
funcs/func_cdr.c
funcs/func_channel.c
funcs/func_dialplan.c
funcs/func_frame_trace.c
funcs/func_global.c
funcs/func_groupcount.c
funcs/func_jitterbuffer.c
funcs/func_math.c
funcs/func_odbc.c
funcs/func_pitchshift.c
funcs/func_speex.c
funcs/func_strings.c
funcs/func_volume.c
main/features_config.c
main/message.c
res/res_calendar.c
res/res_jabber.c
res/res_mutestream.c
res/res_pjsip_header_funcs.c
res/res_xmpp.c

index d1bdfa3..f32c59f 100644 (file)
@@ -951,6 +951,11 @@ static int jack_hook_write(struct ast_channel *chan, const char *cmd, char *data
 {
        int res;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!strcasecmp(value, "on"))
                res = enable_jack_hook(chan, data);
        else if (!strcasecmp(value, "off"))
index 81afa88..e9ca63e 100644 (file)
@@ -285,7 +285,11 @@ static struct ast_speech *find_speech(struct ast_channel *chan)
 {
        struct ast_speech *speech = NULL;
        struct ast_datastore *datastore = NULL;
-       
+
+       if (!chan) {
+               return NULL;
+       }
+
        datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL);
        if (datastore == NULL) {
                return NULL;
index db335c5..72caed8 100644 (file)
@@ -708,6 +708,11 @@ static int local_read(struct ast_channel *chan, const char *cmd, char *data, cha
        struct gosub_stack_frame *frame;
        struct ast_var_t *variables;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        if (!(stack_store = ast_channel_datastore_find(chan, &stack_info, NULL))) {
                ast_channel_unlock(chan);
@@ -742,6 +747,11 @@ static int local_write(struct ast_channel *chan, const char *cmd, char *var, con
        struct gosub_stack_list *oldlist;
        struct gosub_stack_frame *frame;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        if (!(stack_store = ast_channel_datastore_find(chan, &stack_info, NULL))) {
                ast_log(LOG_ERROR, "Tried to set LOCAL(%s), but we aren't within a Gosub routine\n", var);
index f86e4c1..7db2a25 100644 (file)
@@ -12092,7 +12092,9 @@ static int acf_vm_info(struct ast_channel *chan, const char *cmd, char *args, ch
                } else if (!strncasecmp(arg.attribute, "pager", 5)) {
                        ast_copy_string(buf, vmu->pager, len);
                } else if (!strncasecmp(arg.attribute, "language", 8)) {
-                       ast_copy_string(buf, S_OR(vmu->language, ast_channel_language(chan)), len);
+                       const char *lang = S_OR(vmu->language, chan ?
+                               ast_channel_language(chan) : ast_defaultlanguage);
+                       ast_copy_string(buf, lang, len);
                } else if (!strncasecmp(arg.attribute, "locale", 6)) {
                        ast_copy_string(buf, vmu->locale, len);
                } else if (!strncasecmp(arg.attribute, "tz", 2)) {
index 0e81e7e..ec841c9 100644 (file)
@@ -952,6 +952,11 @@ int func_confbridge_helper(struct ast_channel *chan, const char *cmd, char *data
                AST_APP_ARG(option);
        );
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        /* parse all the required arguments and make sure they exist. */
        if (ast_strlen_zero(data)) {
                return -1;
index 185abfc..a83152b 100644 (file)
@@ -9872,10 +9872,16 @@ static int socket_process_meta(int packet_len, struct ast_iax2_meta_hdr *meta, s
 
 static int acf_iaxvar_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
-       struct ast_datastore *variablestore = ast_channel_datastore_find(chan, &iax2_variable_datastore_info, NULL);
+       struct ast_datastore *variablestore;
        AST_LIST_HEAD(, ast_var_t) *varlist;
        struct ast_var_t *var;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       variablestore = ast_channel_datastore_find(chan, &iax2_variable_datastore_info, NULL);
        if (!variablestore) {
                *buf = '\0';
                return 0;
@@ -9895,10 +9901,16 @@ static int acf_iaxvar_read(struct ast_channel *chan, const char *cmd, char *data
 
 static int acf_iaxvar_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
 {
-       struct ast_datastore *variablestore = ast_channel_datastore_find(chan, &iax2_variable_datastore_info, NULL);
+       struct ast_datastore *variablestore;
        AST_LIST_HEAD(, ast_var_t) *varlist;
        struct ast_var_t *var;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       variablestore = ast_channel_datastore_find(chan, &iax2_variable_datastore_info, NULL);
        if (!variablestore) {
                variablestore = ast_datastore_alloc(&iax2_variable_datastore_info, NULL);
                if (!variablestore) {
@@ -14189,8 +14201,9 @@ static int function_iaxpeer(struct ast_channel *chan, const char *cmd, char *dat
        /* if our channel, return the IP address of the endpoint of current channel */
        if (!strcmp(peername,"CURRENTCHANNEL")) {
                unsigned short callno;
-               if (ast_channel_tech(chan) != &iax2_tech)
+               if (!chan || ast_channel_tech(chan) != &iax2_tech) {
                        return -1;
+               }
                callno = PTR_TO_CALLNO(ast_channel_tech_pvt(chan));
                ast_copy_string(buf, !ast_sockaddr_isnull(&iaxs[callno]->addr) ? ast_sockaddr_stringify_addr(&iaxs[callno]->addr) : "", len);
                return 0;
index 231f376..3d52ce4 100644 (file)
@@ -22232,7 +22232,12 @@ static int func_header_read(struct ast_channel *chan, const char *function, char
        );
        int i, number, start = 0;
 
-       if (ast_strlen_zero(data)) {
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
+       if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "This function requires a header name.\n");
                return -1;
        }
@@ -22418,7 +22423,12 @@ static int function_sipchaninfo_read(struct ast_channel *chan, const char *cmd,
 
        *buf = 0;
 
-       if (!data) {
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       if (!data) {
                ast_log(LOG_WARNING, "This function requires a parameter name.\n");
                return -1;
        }
index 817af00..8614825 100644 (file)
@@ -682,7 +682,7 @@ static int read_pjsip(void *data)
 int pjsip_acf_channel_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
        struct pjsip_func_args func_args = { 0, };
-       struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
+       struct ast_sip_channel_pvt *channel;
        char *parse = ast_strdupa(data);
 
        AST_DECLARE_APP_ARGS(args,
@@ -691,6 +691,12 @@ int pjsip_acf_channel_read(struct ast_channel *chan, const char *cmd, char *data
                AST_APP_ARG(field);
        );
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+       channel = ast_channel_tech_pvt(chan);
+
        /* Check for zero arguments */
        if (ast_strlen_zero(parse)) {
                ast_log(LOG_ERROR, "Cannot call %s without arguments\n", cmd);
@@ -863,7 +869,14 @@ static int media_offer_write_av(void *obj)
 
 int pjsip_acf_media_offer_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
-       struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
+       struct ast_sip_channel_pvt *channel;
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       channel = ast_channel_tech_pvt(chan);
 
        if (!strcmp(data, "audio")) {
                return media_offer_read_av(channel->session, buf, len, AST_FORMAT_TYPE_AUDIO);
@@ -876,13 +889,19 @@ int pjsip_acf_media_offer_read(struct ast_channel *chan, const char *cmd, char *
 
 int pjsip_acf_media_offer_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
 {
-       struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
-
+       struct ast_sip_channel_pvt *channel;
        struct media_offer_data mdata = {
-               .session = channel->session,
                .value = value
        };
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       channel = ast_channel_tech_pvt(chan);
+       mdata.session = channel->session;
+
        if (!strcmp(data, "audio")) {
                mdata.media_type = AST_FORMAT_TYPE_AUDIO;
        } else if (!strcmp(data, "video")) {
index 928d5d7..bb04505 100644 (file)
@@ -61,6 +61,11 @@ static int blacklist_read(struct ast_channel *chan, const char *cmd, char *data,
        char blacklist[1];
        int bl = 0;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (ast_channel_caller(chan)->id.number.valid && ast_channel_caller(chan)->id.number.str) {
                if (!ast_db_get("blacklist", ast_channel_caller(chan)->id.number.str, blacklist, sizeof (blacklist)))
                        bl = 1;
index cee06fa..cb1cd59 100644 (file)
@@ -74,6 +74,11 @@ static int acf_cc_read(struct ast_channel *chan, const char *name, char *data,
        struct ast_cc_config_params *cc_params;
        int res;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", name);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        if (!(cc_params = ast_channel_get_cc_config_params(chan))) {
                ast_channel_unlock(chan);
@@ -91,6 +96,11 @@ static int acf_cc_write(struct ast_channel *chan, const char *cmd, char *data,
        struct ast_cc_config_params *cc_params;
        int res;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        if (!(cc_params = ast_channel_get_cc_config_params(chan))) {
                ast_channel_unlock(chan);
index b4649c1..4f6a677 100644 (file)
@@ -900,6 +900,11 @@ static int callerpres_deprecate_notify;
  */
 static int callerpres_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!callerpres_deprecate_notify) {
                callerpres_deprecate_notify = 1;
                ast_log(LOG_WARNING, "CALLERPRES is deprecated."
@@ -926,6 +931,11 @@ static int callerpres_write(struct ast_channel *chan, const char *cmd, char *dat
 {
        int pres;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!callerpres_deprecate_notify) {
                callerpres_deprecate_notify = 1;
                ast_log(LOG_WARNING, "CALLERPRES is deprecated."
index 0116eee..44ecf4d 100644 (file)
@@ -441,6 +441,11 @@ static int cdr_read(struct ast_channel *chan, const char *cmd, char *parse,
                ao2_alloc(sizeof(*payload), NULL), ao2_cleanup);
        struct cdr_func_data output = { 0, };
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!payload) {
                return -1;
        }
@@ -489,6 +494,11 @@ static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse,
        RAII_VAR(struct stasis_message_router *, router,
                     ast_cdr_message_router(), ao2_cleanup);
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!router) {
                ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: no message router\n",
                        ast_channel_name(chan));
@@ -522,6 +532,11 @@ static int cdr_prop_write(struct ast_channel *chan, const char *cmd, char *parse
                ao2_alloc(sizeof(*payload), NULL), ao2_cleanup);
        RAII_VAR(struct stasis_message_router *, router, ast_cdr_message_router(), ao2_cleanup);
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!router) {
                ast_log(AST_LOG_WARNING, "Failed to manipulate CDR for channel %s: no message router\n",
                        ast_channel_name(chan));
index af9a6a9..cca15c3 100644 (file)
@@ -421,6 +421,11 @@ static int func_channel_read(struct ast_channel *chan, const char *function,
        int ret = 0;
        struct ast_format_cap *tmpcap;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        if (!strcasecmp(data, "audionativeformat")) {
                char tmp[512];
 
@@ -733,6 +738,11 @@ static int func_channel_write(struct ast_channel *chan, const char *function, ch
                .value = value,
        };
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        res = func_channel_write_real(chan, function, data, value);
        ast_channel_setoption(chan, AST_OPTION_CHANNEL_WRITE, &write_info, sizeof(write_info), 0);
 
@@ -806,8 +816,15 @@ static struct ast_custom_function channels_function = {
 static int func_mchan_read(struct ast_channel *chan, const char *function,
                             char *data, struct ast_str **buf, ssize_t len)
 {
-       struct ast_channel *mchan = ast_channel_get_by_name(ast_channel_linkedid(chan));
+       struct ast_channel *mchan;
        char *template = ast_alloca(4 + strlen(data));
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
+       mchan = ast_channel_get_by_name(ast_channel_linkedid(chan));
        sprintf(template, "${%s}", data); /* SAFE */
        ast_str_substitute_variables(buf, len, mchan ? mchan : chan, template);
        if (mchan) {
@@ -819,7 +836,14 @@ static int func_mchan_read(struct ast_channel *chan, const char *function,
 static int func_mchan_write(struct ast_channel *chan, const char *function,
                              char *data, const char *value)
 {
-       struct ast_channel *mchan = ast_channel_get_by_name(ast_channel_linkedid(chan));
+       struct ast_channel *mchan;
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
+       mchan = ast_channel_get_by_name(ast_channel_linkedid(chan));
        pbx_builtin_setvar_helper(mchan ? mchan : chan, data, value);
        if (mchan) {
                ast_channel_unref(mchan);
index d06ddba..02b4c7a 100644 (file)
@@ -96,20 +96,23 @@ static int isexten_function_read(struct ast_channel *chan, const char *cmd, char
                int priority_num;
                if (sscanf(args.priority, "%30d", &priority_num) == 1 && priority_num > 0) {
                        int res;
-                       res = ast_exists_extension(chan, args.context, args.exten, priority_num, 
+                       res = ast_exists_extension(chan, args.context, args.exten, priority_num,
+                               !chan ? NULL :
                                S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
                        if (res)
                                strcpy(buf, "1");
                } else {
                        int res;
                        res = ast_findlabel_extension(chan, args.context, args.exten, args.priority,
+                               !chan ? NULL :
                                S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
                        if (res > 0)
                                strcpy(buf, "1");
                }
        } else if (!ast_strlen_zero(args.exten)) {
                int res;
-               res = ast_exists_extension(chan, args.context, args.exten, 1, 
+               res = ast_exists_extension(chan, args.context, args.exten, 1,
+                       !chan ? NULL :
                        S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL));
                if (res)
                        strcpy(buf, "1");
@@ -133,6 +136,11 @@ static int acf_isexten_exec(struct ast_channel *chan, const char *cmd, char *par
                AST_APP_ARG(priority);
        );
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        AST_STANDARD_APP_ARGS(args, parse);
 
        if (ast_strlen_zero(args.context)) {
index bdbc596..6452d0b 100644 (file)
@@ -157,6 +157,11 @@ static int frame_trace_helper(struct ast_channel *chan, const char *cmd, char *d
        };
        int i = 0;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!(framedata = ast_calloc(1, sizeof(*framedata)))) {
                return 0;
        }
index 3747202..a2329c4 100644 (file)
@@ -173,6 +173,9 @@ static int shared_read(struct ast_channel *chan, const char *cmd, char *data, ch
                        return -1;
                }
                chan = c_ref;
+       } else if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
        }
 
        ast_channel_lock(chan);
@@ -233,6 +236,9 @@ static int shared_write(struct ast_channel *chan, const char *cmd, char *data, c
                        return -1;
                }
                chan = c_ref;
+       } else if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
        }
 
        len = 9 + strlen(args.var); /* SHARED() + var */
index 95ee0cd..4ea6816 100644 (file)
@@ -104,6 +104,11 @@ static int group_count_function_read(struct ast_channel *chan, const char *cmd,
        int count = -1;
        char group[80] = "", category[80] = "";
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_app_group_split_group(data, group, sizeof(group), category,
                                  sizeof(category));
 
@@ -174,9 +179,14 @@ static int group_function_read(struct ast_channel *chan, const char *cmd,
 {
        int ret = -1;
        struct ast_group_info *gi = NULL;
-       
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_app_group_list_rdlock();
-       
+
        for (gi = ast_app_group_list_head(); gi; gi = AST_LIST_NEXT(gi, group_list)) {
                if (gi->chan != chan)
                        continue;
@@ -201,6 +211,11 @@ static int group_function_write(struct ast_channel *chan, const char *cmd,
 {
        char grpcat[256];
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (!value) {
                return -1;
        }
index a003610..31ab86c 100644 (file)
@@ -85,6 +85,11 @@ static int jb_helper(struct ast_channel *chan, const char *cmd, char *data, cons
 {
        struct ast_jb_conf jb_conf;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        /* Initialize and set jb_conf */
        ast_jb_conf_default(&jb_conf);
 
index 36f3fc4..2bc68c5 100644 (file)
@@ -392,6 +392,11 @@ static int crement_function_read(struct ast_channel *chan, const char *cmd,
                return -1;
        }
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
 
        if (!(var = pbx_builtin_getvar_helper(chan, data))) {
index 4469ca7..5e7655f 100644 (file)
@@ -801,6 +801,11 @@ static int acf_fetch(struct ast_channel *chan, const char *cmd, char *data, char
        struct odbc_datastore *resultset;
        struct odbc_datastore_row *row;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        store = ast_channel_datastore_find(chan, &odbc_info, data);
        if (!store) {
index ca441f9..e5091d9 100644 (file)
@@ -200,6 +200,11 @@ static int pitchshift_helper(struct ast_channel *chan, const char *cmd, char *da
        int new = 0;
        float amount = 0;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_channel_lock(chan);
        if (!(datastore = ast_channel_datastore_find(chan, &pitchshift_datastore, NULL))) {
                ast_channel_unlock(chan);
index 7467c23..4e3c13b 100644 (file)
@@ -202,6 +202,11 @@ static int speex_write(struct ast_channel *chan, const char *cmd, char *data, co
        struct speex_direction_info **sdi = NULL;
        int is_new = 0;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (strcasecmp(data, "rx") && strcasecmp(data, "tx")) {
                ast_log(LOG_ERROR, "Invalid argument provided to the %s function\n", cmd);
                return -1;
index 3dd0168..ac889ec 100644 (file)
@@ -1097,6 +1097,11 @@ static int hashkeys_read(struct ast_channel *chan, const char *cmd, char *data,
        struct ast_var_t *newvar;
        struct ast_str *prefix = ast_str_alloca(80);
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_str_set(&prefix, -1, HASH_PREFIX, data);
        memset(buf, 0, len);
 
@@ -1119,6 +1124,11 @@ static int hashkeys_read2(struct ast_channel *chan, const char *cmd, char *data,
        struct ast_str *prefix = ast_str_alloca(80);
        char *tmp;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        ast_str_set(&prefix, -1, HASH_PREFIX, data);
 
        AST_LIST_TRAVERSE(ast_channel_varshead(chan), newvar, entries) {
@@ -1188,6 +1198,11 @@ static int hash_read(struct ast_channel *chan, const char *cmd, char *data, char
                        AST_APP_ARG(col)[100];
                );
 
+               if (!chan) {
+                       ast_log(LOG_WARNING, "No channel and only 1 parameter was provided to %s function.\n", cmd);
+                       return -1;
+               }
+
                /* Get column names, in no particular order */
                hashkeys_read(chan, "HASHKEYS", arg.hashname, colnames, sizeof(colnames));
                pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", colnames);
index 953a37d..9fd0200 100644 (file)
@@ -156,12 +156,17 @@ static int volume_write(struct ast_channel *chan, const char *cmd, char *data, c
        int is_new = 0;
 
        /* Separate options from argument */
-       
+
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(direction);
                AST_APP_ARG(options);
        );
-       
+
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        AST_STANDARD_APP_ARGS(args, data);
 
        ast_channel_lock(chan);
index 3d2ded5..d58886e 100644 (file)
@@ -1535,7 +1535,7 @@ static int features_pre_apply_config(void)
        return err;
 }
 
-static int feature_read(struct ast_channel *chan, const char *cmd, char *data,
+static int internal_feature_read(struct ast_channel *chan, const char *cmd, char *data,
               char *buf, size_t len)
 {
        int res;
@@ -1566,7 +1566,7 @@ static int feature_read(struct ast_channel *chan, const char *cmd, char *data,
        return res;
 }
 
-static int feature_write(struct ast_channel *chan, const char *cmd, char *data,
+static int internal_feature_write(struct ast_channel *chan, const char *cmd, char *data,
                const char *value)
 {
        int res;
@@ -1596,7 +1596,7 @@ static int feature_write(struct ast_channel *chan, const char *cmd, char *data,
        return res;
 }
 
-static int featuremap_read(struct ast_channel *chan, const char *cmd, char *data,
+static int internal_featuremap_read(struct ast_channel *chan, const char *cmd, char *data,
               char *buf, size_t len)
 {
        int res;
@@ -1611,7 +1611,7 @@ static int featuremap_read(struct ast_channel *chan, const char *cmd, char *data
        return res;
 }
 
-static int featuremap_write(struct ast_channel *chan, const char *cmd, char *data,
+static int internal_featuremap_write(struct ast_channel *chan, const char *cmd, char *data,
                const char *value)
 {
        int res;
@@ -1631,6 +1631,50 @@ static int featuremap_write(struct ast_channel *chan, const char *cmd, char *dat
        return 0;
 }
 
+static int feature_read(struct ast_channel *chan, const char *cmd, char *data,
+               char *buf, size_t len)
+{
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       return internal_feature_read(chan, cmd, data, buf, len);
+}
+
+static int feature_write(struct ast_channel *chan, const char *cmd, char *data,
+               const char *value)
+{
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       return internal_feature_write(chan, cmd, data, value);
+}
+
+static int featuremap_read(struct ast_channel *chan, const char *cmd, char *data,
+               char *buf, size_t len)
+{
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       return internal_featuremap_read(chan, cmd, data, buf, len);
+}
+
+static int featuremap_write(struct ast_channel *chan, const char *cmd, char *data,
+               const char *value)
+{
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
+       return internal_featuremap_write(chan, cmd, data, value);
+}
+
 static struct ast_custom_function feature_function = {
        .name = "FEATURE",
        .read = feature_read,
index 70bda41..bd706e3 100644 (file)
@@ -871,6 +871,11 @@ static int msg_func_read(struct ast_channel *chan, const char *function,
        struct ast_datastore *ds;
        struct ast_msg *msg;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        ast_channel_lock(chan);
 
        if (!(ds = ast_channel_datastore_find(chan, &msg_datastore, NULL))) {
@@ -907,6 +912,11 @@ static int msg_func_write(struct ast_channel *chan, const char *function,
        struct ast_datastore *ds;
        struct ast_msg *msg;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        ast_channel_lock(chan);
 
        if (!(ds = msg_datastore_find_or_create(chan))) {
@@ -963,6 +973,11 @@ static int msg_data_func_read(struct ast_channel *chan, const char *function,
        struct ast_msg *msg;
        const char *val;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        ast_channel_lock(chan);
 
        if (!(ds = ast_channel_datastore_find(chan, &msg_datastore, NULL))) {
@@ -993,6 +1008,11 @@ static int msg_data_func_write(struct ast_channel *chan, const char *function,
        struct ast_datastore *ds;
        struct ast_msg *msg;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", function);
+               return -1;
+       }
+
        ast_channel_lock(chan);
 
        if (!(ds = msg_datastore_find_or_create(chan))) {
index f279e73..e6c93fd 100644 (file)
@@ -1685,6 +1685,11 @@ static int calendar_event_read(struct ast_channel *chan, const char *cmd, char *
        struct ast_datastore *datastore;
        struct ast_calendar_event *event;
 
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "%s requires an argument\n", cmd);
                return -1;
index 41dd70c..ede4981 100644 (file)
@@ -845,7 +845,7 @@ static int acf_jabberreceive_read(struct ast_channel *chan, const char *name, ch
 
        start = ast_tvnow();
 
-       if (ast_autoservice_start(chan) < 0) {
+       if (chan && ast_autoservice_start(chan) < 0) {
                ast_log(LOG_WARNING, "Cannot start autoservice for channel %s\n", ast_channel_name(chan));
                ASTOBJ_UNREF(client, ast_aji_client_destroy);
                return -1;
@@ -917,7 +917,7 @@ static int acf_jabberreceive_read(struct ast_channel *chan, const char *name, ch
        }
 
        ASTOBJ_UNREF(client, ast_aji_client_destroy);
-       if (ast_autoservice_stop(chan) < 0) {
+       if (chan && ast_autoservice_stop(chan) < 0) {
                ast_log(LOG_WARNING, "Cannot stop autoservice for channel %s\n", ast_channel_name(chan));
        }
 
index b907fbe..479b3d7 100644 (file)
@@ -155,6 +155,11 @@ static int mute_channel(struct ast_channel *chan, const char *direction, int mut
 /*! \brief Mute dialplan function */
 static int func_mute_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
 {
+       if (!chan) {
+               ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd);
+               return -1;
+       }
+
        return mute_channel(chan, data, ast_true(value));
 }
 
index 5d09d10..b5383fb 100644 (file)
@@ -444,7 +444,7 @@ static int remove_header(void *obj)
 static int func_read_header(struct ast_channel *chan, const char *function, char *data,
                                                        char *buf, size_t len)
 {
-       struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
+       struct ast_sip_channel_pvt *channel = chan ? ast_channel_tech_pvt(chan) : NULL;
        struct header_data header_data;
        int number;
        AST_DECLARE_APP_ARGS(args,
@@ -503,7 +503,7 @@ static int func_read_header(struct ast_channel *chan, const char *function, char
 static int func_write_header(struct ast_channel *chan, const char *cmd, char *data,
                                                         const char *value)
 {
-       struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
+       struct ast_sip_channel_pvt *channel = chan ? ast_channel_tech_pvt(chan) : NULL;
        struct header_data header_data;
        int header_number;
        AST_DECLARE_APP_ARGS(args,
index c067fde..fcdd2c4 100644 (file)
@@ -2045,7 +2045,7 @@ static int acf_jabberreceive_read(struct ast_channel *chan, const char *name, ch
 
        start = ast_tvnow();
 
-       if (ast_autoservice_start(chan) < 0) {
+       if (chan && ast_autoservice_start(chan) < 0) {
                ast_log(LOG_WARNING, "Cannot start autoservice for channel %s\n", ast_channel_name(chan));
                return -1;
        }
@@ -2117,7 +2117,7 @@ static int acf_jabberreceive_read(struct ast_channel *chan, const char *name, ch
                diff = ast_tvdiff_ms(ast_tvnow(), start);
        }
 
-       if (ast_autoservice_stop(chan) < 0) {
+       if (chan && ast_autoservice_stop(chan) < 0) {
                ast_log(LOG_WARNING, "Cannot stop autoservice for channel %s\n", ast_channel_name(chan));
        }