From 23be89dfff6a73cd8ac09ed988c4e7de9864c160 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Sat, 26 Oct 2013 12:55:11 +0000 Subject: [PATCH] chan_pjsip: Fix a crash when direct media is enabled and an ACK is received after the channel is hung up. (closes issue ASTERISK-22731) Reported by: Kinsey Moore git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@402064 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_pjsip.c | 2 +- include/asterisk/res_pjsip_session.h | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 6ceece4fcc..8eb6be38b4 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -2046,7 +2046,7 @@ static void chan_pjsip_incoming_response(struct ast_sip_session *session, struct static int chan_pjsip_incoming_ack(struct ast_sip_session *session, struct pjsip_rx_data *rdata) { if (rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD) { - if (session->endpoint->media.direct_media.enabled) { + if (session->endpoint->media.direct_media.enabled && session->channel) { ast_queue_control(session->channel, AST_CONTROL_SRCCHANGE); } } diff --git a/include/asterisk/res_pjsip_session.h b/include/asterisk/res_pjsip_session.h index 2df2262ad6..7b359cdf1f 100644 --- a/include/asterisk/res_pjsip_session.h +++ b/include/asterisk/res_pjsip_session.h @@ -190,6 +190,9 @@ struct ast_sip_session_supplement { * The reason is that the rdata passed into this function is a cloned rdata structure, * and its module data is not copied during the cloning operation. * If you need to get the dialog, you can get it via session->inv_session->dlg. + * + * \note + * There is no guarantee that a channel will be present on the session when this is called. */ int (*incoming_request)(struct ast_sip_session *session, struct pjsip_rx_data *rdata); /*! @@ -203,6 +206,9 @@ struct ast_sip_session_supplement { * The reason is that the rdata passed into this function is a cloned rdata structure, * and its module data is not copied during the cloning operation. * If you need to get the dialog, you can get it via session->inv_session->dlg. + * + * \note + * There is no guarantee that a channel will be present on the session when this is called. */ void (*incoming_response)(struct ast_sip_session *session, struct pjsip_rx_data *rdata); /*! -- 2.47.2