diff options
author | Corey Farrell <git@cfware.com> | 2014-03-27 19:21:44 +0000 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2014-03-27 19:21:44 +0000 |
commit | fbe0dfaf4410a4ed34cca248d0885ea87c747e27 (patch) | |
tree | b8adead7bbb0c61a5b1873c5432dd0359af50047 /channels/pjsip/dialplan_functions.c | |
parent | 44409401ec7d754a2af861f599e88e5199c2ccf0 (diff) |
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
Diffstat (limited to 'channels/pjsip/dialplan_functions.c')
-rw-r--r-- | channels/pjsip/dialplan_functions.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c index 817af002d..86148259a 100644 --- a/channels/pjsip/dialplan_functions.c +++ b/channels/pjsip/dialplan_functions.c @@ -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")) { |