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
........

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
changes/97/197/1
Corey Farrell 11 years ago
parent 44409401ec
commit fbe0dfaf44

@ -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"))

@ -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;

@ -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);

@ -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)) {

@ -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;

@ -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;

@ -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;
}

@ -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")) {

@ -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;

@ -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);

@ -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."

@ -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));

@ -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);

@ -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)) {

@ -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;
}

@ -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 */

@ -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;
}

@ -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);

@ -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))) {

@ -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) {

@ -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);

@ -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;

@ -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);

@ -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);

@ -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,

@ -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))) {

@ -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;

@ -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));
}

@ -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));
}

@ -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,

@ -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));
}

Loading…
Cancel
Save