From: Corey Farrell Date: Thu, 27 Mar 2014 19:13:09 +0000 (+0000) Subject: Fix dialplan function NULL channel safety issues X-Git-Tag: 11.9.0-rc1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8fe29356ac09e79be6881f6357007d9e4a2edc2d;p=thirdparty%2Fasterisk.git Fix dialplan function NULL channel safety issues (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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@411314 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_jack.c b/apps/app_jack.c index d1bdfa38f0..f32c59ff0b 100644 --- a/apps/app_jack.c +++ b/apps/app_jack.c @@ -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")) diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index 3e071c07a8..c0829c32fd 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -284,7 +284,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; diff --git a/apps/app_stack.c b/apps/app_stack.c index 20b03087f3..dcd35d235b 100644 --- a/apps/app_stack.c +++ b/apps/app_stack.c @@ -687,6 +687,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); @@ -721,6 +726,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); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 3158efd469..1fb5160ea0 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -12045,7 +12045,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) : 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)) { diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index cddf2732f6..93cde54a3c 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -354,6 +354,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; diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 64f50f2c77..a288644785 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -10013,10 +10013,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; @@ -10036,10 +10042,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) { @@ -14307,8 +14319,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, iaxs[callno]->addr.sin_addr.s_addr ? ast_inet_ntoa(iaxs[callno]->addr.sin_addr) : "", len); return 0; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index eae51bbd05..018bd2d681 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -21992,7 +21992,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; } @@ -22177,8 +22182,13 @@ static int function_sipchaninfo_read(struct ast_channel *chan, const char *cmd, static int deprecated = 0; *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; } diff --git a/funcs/func_blacklist.c b/funcs/func_blacklist.c index 928d5d728a..bb045059b2 100644 --- a/funcs/func_blacklist.c +++ b/funcs/func_blacklist.c @@ -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; diff --git a/funcs/func_callcompletion.c b/funcs/func_callcompletion.c index cee06faa47..cb1cd59b3f 100644 --- a/funcs/func_callcompletion.c +++ b/funcs/func_callcompletion.c @@ -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); diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index 789575399e..1af42183e6 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -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." diff --git a/funcs/func_channel.c b/funcs/func_channel.c index 4180eeaa7f..00dfba90e5 100644 --- a/funcs/func_channel.c +++ b/funcs/func_channel.c @@ -405,6 +405,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]; @@ -703,6 +708,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); @@ -776,8 +786,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) { @@ -789,7 +806,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); diff --git a/funcs/func_dialplan.c b/funcs/func_dialplan.c index d06ddba9a6..02b4c7a9e4 100644 --- a/funcs/func_dialplan.c +++ b/funcs/func_dialplan.c @@ -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)) { diff --git a/funcs/func_frame_trace.c b/funcs/func_frame_trace.c index 8e12aafb35..90778e23cd 100644 --- a/funcs/func_frame_trace.c +++ b/funcs/func_frame_trace.c @@ -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; } diff --git a/funcs/func_global.c b/funcs/func_global.c index 405ac0b92f..dcf0393520 100644 --- a/funcs/func_global.c +++ b/funcs/func_global.c @@ -155,6 +155,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); @@ -213,6 +216,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; } ast_channel_lock(chan); diff --git a/funcs/func_groupcount.c b/funcs/func_groupcount.c index 95ee0cde61..4ea6816918 100644 --- a/funcs/func_groupcount.c +++ b/funcs/func_groupcount.c @@ -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; } diff --git a/funcs/func_jitterbuffer.c b/funcs/func_jitterbuffer.c index 066d9d2f62..1e90a5c5e3 100644 --- a/funcs/func_jitterbuffer.c +++ b/funcs/func_jitterbuffer.c @@ -325,6 +325,11 @@ static int jb_helper(struct ast_channel *chan, const char *cmd, char *data, cons }; 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; } diff --git a/funcs/func_math.c b/funcs/func_math.c index 36f3fc48a6..2bc68c579a 100644 --- a/funcs/func_math.c +++ b/funcs/func_math.c @@ -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))) { diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c index 4469ca7a27..5e7655f908 100644 --- a/funcs/func_odbc.c +++ b/funcs/func_odbc.c @@ -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) { diff --git a/funcs/func_pitchshift.c b/funcs/func_pitchshift.c index ca441f9850..e5091d95dd 100644 --- a/funcs/func_pitchshift.c +++ b/funcs/func_pitchshift.c @@ -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); diff --git a/funcs/func_speex.c b/funcs/func_speex.c index fb5addbb4a..7da3e876d7 100644 --- a/funcs/func_speex.c +++ b/funcs/func_speex.c @@ -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; diff --git a/funcs/func_strings.c b/funcs/func_strings.c index 8b4d8f7007..57b7720887 100644 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -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); diff --git a/funcs/func_volume.c b/funcs/func_volume.c index 953a37dcdd..9fd02008fe 100644 --- a/funcs/func_volume.c +++ b/funcs/func_volume.c @@ -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); diff --git a/main/features.c b/main/features.c index e23a47e3c5..d21d92d78c 100644 --- a/main/features.c +++ b/main/features.c @@ -8913,6 +8913,11 @@ static int feature_read(struct ast_channel *chan, const char *cmd, char *data, { int res = 0; + if (!chan) { + ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); + return -1; + } + if (!strcasecmp(data, "parkingtime")) { snprintf(buf, len, "%u", get_parkingtime(chan, NULL) / 1000); } else { @@ -8929,6 +8934,11 @@ static int feature_write(struct ast_channel *chan, const char *cmd, char *data, int res = 0; struct feature_ds *feature_ds; + if (!chan) { + ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); + return -1; + } + ast_channel_lock(chan); if (!(feature_ds = get_feature_ds(chan))) { @@ -8961,6 +8971,11 @@ static int featuremap_read(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; + } + ast_rdlock_call_features(); if ((res = builtin_feature_get_exten(chan, data, buf, len))) { @@ -8978,6 +8993,11 @@ static int featuremap_write(struct ast_channel *chan, const char *cmd, char *dat struct feature_ds *feature_ds; struct feature_exten *fe; + if (!chan) { + ast_log(LOG_WARNING, "No channel was provided to %s function.\n", cmd); + return -1; + } + if (!ast_find_call_feature(data)) { ast_log(LOG_WARNING, "Invalid argument '%s' to FEATUREMAP()\n", data); return -1; diff --git a/main/message.c b/main/message.c index bb98e24d99..327d3b0c55 100644 --- a/main/message.c +++ b/main/message.c @@ -867,6 +867,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))) { @@ -903,6 +908,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))) { @@ -959,6 +969,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))) { @@ -989,6 +1004,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))) { diff --git a/res/res_calendar.c b/res/res_calendar.c index 0ec032cf99..1691d29a2b 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -1673,6 +1673,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; diff --git a/res/res_jabber.c b/res/res_jabber.c index 72195f22fa..e4556254ae 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -837,7 +837,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; @@ -909,7 +909,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)); } diff --git a/res/res_mutestream.c b/res/res_mutestream.c index f7032eacf7..2fc8a4964d 100644 --- a/res/res_mutestream.c +++ b/res/res_mutestream.c @@ -235,6 +235,11 @@ static int func_mute_write(struct ast_channel *chan, const char *cmd, char *data int is_new = 0; int turnon; + 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, &mute_datastore, NULL))) { if (!(datastore = initialize_mutehook(chan))) { diff --git a/res/res_xmpp.c b/res/res_xmpp.c index b5d0e8a88c..a011d5e5ff 100644 --- a/res/res_xmpp.c +++ b/res/res_xmpp.c @@ -1923,7 +1923,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; } @@ -1995,7 +1995,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)); }