[asterisk-commits] file: branch 13 r428302 - in /branches/13: ./ channels/chan_pjsip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Nov 20 08:49:18 CST 2014
Author: file
Date: Thu Nov 20 08:49:15 2014
New Revision: 428302
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=428302
Log:
AST-2014-015: Fix race condition in chan_pjsip when sending responses after a CANCEL has been received.
Due to the serialized architecture of chan_pjsip there exists a race condition where a CANCEL may
be received and processed before responses (such as 180 Ringing, 183 Session Progress, and 200 OK)
are sent. Since the session is in an unexpected state PJSIP will assert when this is attempted.
This change makes it so that these responses are not sent on disconnected sessions.
ASTERISK-24471 #close
Reported by: yaron nahum
........
Merged revisions 428301 from http://svn.asterisk.org/svn/asterisk/branches/12
Modified:
branches/13/ (props changed)
branches/13/channels/chan_pjsip.c
Propchange: branches/13/
------------------------------------------------------------------------------
Binary property 'branch-12-merged' - no diff available.
Modified: branches/13/channels/chan_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/channels/chan_pjsip.c?view=diff&rev=428302&r1=428301&r2=428302
==============================================================================
--- branches/13/channels/chan_pjsip.c (original)
+++ branches/13/channels/chan_pjsip.c Thu Nov 20 08:49:15 2014
@@ -489,6 +489,11 @@
pjsip_tx_data *packet = NULL;
struct ast_sip_session *session = data;
+ if (session->inv_session->state == PJSIP_INV_STATE_DISCONNECTED) {
+ ao2_ref(session, -1);
+ return 0;
+ }
+
pjsip_dlg_inc_lock(session->inv_session->dlg);
if (session->inv_session->invite_tsx) {
status = pjsip_inv_answer(session->inv_session, 200, NULL, NULL, &packet);
@@ -1001,7 +1006,8 @@
struct ast_sip_session *session = ind_data->session;
int response_code = ind_data->response_code;
- if (pjsip_inv_answer(session->inv_session, response_code, NULL, NULL, &packet) == PJ_SUCCESS) {
+ if ((session->inv_session->state != PJSIP_INV_STATE_DISCONNECTED) &&
+ (pjsip_inv_answer(session->inv_session, response_code, NULL, NULL, &packet) == PJ_SUCCESS)) {
ast_sip_session_send_response(session, packet);
}
@@ -1052,6 +1058,10 @@
if ((ast_channel_state(session->channel) != AST_STATE_UP) && (session->inv_session->role == PJSIP_UAS_ROLE)) {
int response_code = 0;
+
+ if (session->inv_session->state == PJSIP_INV_STATE_DISCONNECTED) {
+ return 0;
+ }
if (ast_channel_state(session->channel) == AST_STATE_RING) {
response_code = !session->endpoint->inband_progress ? 180 : 183;
More information about the asterisk-commits
mailing list