diff options
author | Joshua Colp <jcolp@digium.com> | 2013-10-26 12:56:08 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2013-10-26 12:56:08 +0000 |
commit | 26914adc000c99c56dec0e0eb6e3d963b7dbe950 (patch) | |
tree | 2b03cd7a9386b1061ecad34ce9d57159e2b3e3ae | |
parent | 8e4084b58653eb988340e55ea59be859f6b6001f (diff) |
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
........
Merged revisions 402064 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@402065 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_pjsip.c | 2 | ||||
-rw-r--r-- | include/asterisk/res_pjsip_session.h | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 6ceece4fc..8eb6be38b 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 2df2262ad..7b359cdf1 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); /*! |