summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-10-26 12:56:08 +0000
committerJoshua Colp <jcolp@digium.com>2013-10-26 12:56:08 +0000
commit26914adc000c99c56dec0e0eb6e3d963b7dbe950 (patch)
tree2b03cd7a9386b1061ecad34ce9d57159e2b3e3ae
parent8e4084b58653eb988340e55ea59be859f6b6001f (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.c2
-rw-r--r--include/asterisk/res_pjsip_session.h6
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);
/*!