From 12460b05c1abd37e412e155e47a6e349a2df3338 Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Sun, 12 Mar 2017 14:21:16 +0000 Subject: [PATCH] chan_pjsip: Don't assume a session will have a channel. When querying for PJSIP specific information using the dialplan function CHANNEL() it is possible that the underlying session will no longer have a channel associated with it. This is most likely to occur when the RTCP HEP module attempts to get the channel name. If this happens then a crash will occur. This change just adds a check that the channel exists on the session before querying it. ASTERISK-26857 Change-Id: I113479cffff6ae64cf8ed089e9e1565223426f01 --- channels/pjsip/dialplan_functions.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c index 17c19b7c0c..332df70b4a 100644 --- a/channels/pjsip/dialplan_functions.c +++ b/channels/pjsip/dialplan_functions.c @@ -735,17 +735,27 @@ static int read_pjsip(void *data) struct pjsip_func_args *func_args = data; if (!strcmp(func_args->param, "rtp")) { + if (!func_args->session->channel) { + func_args->ret = -1; + return 0; + } func_args->ret = channel_read_rtp(func_args->session->channel, func_args->type, func_args->field, func_args->buf, func_args->len); } else if (!strcmp(func_args->param, "rtcp")) { + if (!func_args->session->channel) { + func_args->ret = -1; + return 0; + } func_args->ret = channel_read_rtcp(func_args->session->channel, func_args->type, func_args->field, func_args->buf, func_args->len); } else if (!strcmp(func_args->param, "endpoint")) { if (!func_args->session->endpoint) { - ast_log(AST_LOG_WARNING, "Channel %s has no endpoint!\n", ast_channel_name(func_args->session->channel)); - return -1; + ast_log(AST_LOG_WARNING, "Channel %s has no endpoint!\n", func_args->session->channel ? + ast_channel_name(func_args->session->channel) : "<unknown>"); + func_args->ret = -1; + return 0; } snprintf(func_args->buf, func_args->len, "%s", ast_sorcery_object_get_id(func_args->session->endpoint)); } else if (!strcmp(func_args->param, "contact")) { @@ -759,6 +769,10 @@ static int read_pjsip(void *data) } snprintf(func_args->buf, func_args->len, "%s", ast_sorcery_object_get_id(func_args->session->aor)); } else if (!strcmp(func_args->param, "pjsip")) { + if (!func_args->session->channel) { + func_args->ret = -1; + return 0; + } func_args->ret = channel_read_pjsip(func_args->session->channel, func_args->type, func_args->field, func_args->buf, func_args->len); -- GitLab