From 3985dd57937870f3d47a4ddd68b477a42ffddec1 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Fri, 5 Feb 2016 04:29:17 +0000 Subject: Fixed #1902: - Crash when endpoint has multiple worker threads and SIP TCP transport is disconnected during incoming call handling. - Deprecated pjsip_dlg_create_uas(), replaced by pjsip_dlg_create_uas_and_inc_lock(). - Serialized transaction state notifications (of 'terminated' and 'destroyed') in case of transport error. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5241 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/src/samples/footprint.c | 2 +- pjsip-apps/src/samples/pjsip-perf.c | 8 ++++++-- pjsip-apps/src/samples/simpleua.c | 25 +++++++++++++++++++------ pjsip-apps/src/samples/sipecho.c | 11 ++++++++--- pjsip-apps/src/samples/siprtp.c | 7 +++++-- 5 files changed, 39 insertions(+), 14 deletions(-) (limited to 'pjsip-apps') diff --git a/pjsip-apps/src/samples/footprint.c b/pjsip-apps/src/samples/footprint.c index 9b666874..74e6be43 100644 --- a/pjsip-apps/src/samples/footprint.c +++ b/pjsip-apps/src/samples/footprint.c @@ -341,7 +341,7 @@ int dummy_function() pjsip_ua_init_module(NULL, NULL); pjsip_ua_destroy(); pjsip_dlg_create_uac(NULL, NULL, NULL, NULL, NULL, NULL); - pjsip_dlg_create_uas(NULL, NULL, NULL, NULL); + pjsip_dlg_create_uas_and_inc_lock(NULL, NULL, NULL, NULL); pjsip_dlg_terminate(NULL); pjsip_dlg_set_route_set(NULL, NULL); pjsip_dlg_create_request(NULL, NULL, -1, NULL); diff --git a/pjsip-apps/src/samples/pjsip-perf.c b/pjsip-apps/src/samples/pjsip-perf.c index 10bde943..bc963330 100644 --- a/pjsip-apps/src/samples/pjsip-perf.c +++ b/pjsip-apps/src/samples/pjsip-perf.c @@ -475,8 +475,8 @@ static pj_bool_t mod_call_on_rx_request(pjsip_rx_data *rdata) } /* Create UAS dialog */ - status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, - &app.local_contact, &dlg); + status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata, + &app.local_contact, &dlg); if (status != PJ_SUCCESS) { const pj_str_t reason = pj_str("Unable to create dialog"); pjsip_endpt_respond_stateless( app.sip_endpt, rdata, @@ -502,9 +502,13 @@ static pj_bool_t mod_call_on_rx_request(pjsip_rx_data *rdata) if (status != PJ_SUCCESS) { pjsip_dlg_create_response(dlg, rdata, 500, NULL, &tdata); pjsip_dlg_send_response(dlg, pjsip_rdata_get_tsx(rdata), tdata); + pjsip_dlg_dec_lock(dlg); return PJ_TRUE; } + /* Invite session has been created, decrement & release dialog lock. */ + pjsip_dlg_dec_lock(dlg); + /* Send 100/Trying if needed */ if (app.server.send_trying) { status = send_response(call->inv, rdata, 100, &has_initial); diff --git a/pjsip-apps/src/samples/simpleua.c b/pjsip-apps/src/samples/simpleua.c index b7f10250..a1bac754 100644 --- a/pjsip-apps/src/samples/simpleua.c +++ b/pjsip-apps/src/samples/simpleua.c @@ -725,10 +725,10 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) /* * Create UAS dialog. */ - status = pjsip_dlg_create_uas( pjsip_ua_instance(), - rdata, - &local_uri, /* contact */ - &dlg); + status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), + rdata, + &local_uri, /* contact */ + &dlg); if (status != PJ_SUCCESS) { pjsip_endpt_respond_stateless(g_endpt, rdata, 500, NULL, NULL, NULL); @@ -741,7 +741,11 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) status = pjmedia_endpt_create_sdp( g_med_endpt, rdata->tp_info.pool, MAX_MEDIA_CNT, g_sock_info, &local_sdp); - PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE); + pj_assert(status == PJ_SUCCESS); + if (status != PJ_SUCCESS) { + pjsip_dlg_dec_lock(dlg); + return PJ_TRUE; + } /* @@ -749,7 +753,16 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) * capability to the session. */ status = pjsip_inv_create_uas( dlg, rdata, local_sdp, 0, &g_inv); - PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE); + pj_assert(status == PJ_SUCCESS); + if (status != PJ_SUCCESS) { + pjsip_dlg_dec_lock(dlg); + return PJ_TRUE; + } + + /* + * Invite session has been created, decrement & release dialog lock. + */ + pjsip_dlg_dec_lock(dlg); /* diff --git a/pjsip-apps/src/samples/sipecho.c b/pjsip-apps/src/samples/sipecho.c index 6c5244d8..b0fb4c2f 100644 --- a/pjsip-apps/src/samples/sipecho.c +++ b/pjsip-apps/src/samples/sipecho.c @@ -417,7 +417,7 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) pj_sockaddr hostaddr; char temp[80], hostip[PJ_INET6_ADDRSTRLEN]; pj_str_t local_uri; - pjsip_dialog *dlg; + pjsip_dialog *dlg = NULL; pjsip_rdata_sdp_info *sdp_info; pjmedia_sdp_session *answer = NULL; pjsip_tx_data *tdata = NULL; @@ -498,13 +498,18 @@ static pj_bool_t on_rx_request( pjsip_rx_data *rdata ) pj_ansi_sprintf(temp, "", hostip, sip_port); local_uri = pj_str(temp); - status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, - &local_uri, &dlg); + status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata, + &local_uri, &dlg); if (status == PJ_SUCCESS) answer = create_answer((int)(call-app.call), dlg->pool, sdp_info->sdp); + if (status == PJ_SUCCESS) status = pjsip_inv_create_uas( dlg, rdata, answer, 0, &call->inv); + + if (dlg) + pjsip_dlg_dec_lock(dlg); + if (status == PJ_SUCCESS) status = pjsip_inv_initial_answer(call->inv, rdata, 100, NULL, NULL, &tdata); diff --git a/pjsip-apps/src/samples/siprtp.c b/pjsip-apps/src/samples/siprtp.c index 262e2033..8e74c338 100644 --- a/pjsip-apps/src/samples/siprtp.c +++ b/pjsip-apps/src/samples/siprtp.c @@ -637,8 +637,8 @@ static void process_incoming_call(pjsip_rx_data *rdata) } /* Create UAS dialog */ - status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, - &app.local_contact, &dlg); + status = pjsip_dlg_create_uas_and_inc_lock( pjsip_ua_instance(), rdata, + &app.local_contact, &dlg); if (status != PJ_SUCCESS) { const pj_str_t reason = pj_str("Unable to create dialog"); pjsip_endpt_respond_stateless( app.sip_endpt, rdata, @@ -655,9 +655,12 @@ static void process_incoming_call(pjsip_rx_data *rdata) if (status != PJ_SUCCESS) { pjsip_dlg_create_response(dlg, rdata, 500, NULL, &tdata); pjsip_dlg_send_response(dlg, pjsip_rdata_get_tsx(rdata), tdata); + pjsip_dlg_dec_lock(dlg); return; } + /* Invite session has been created, decrement & release dialog lock */ + pjsip_dlg_dec_lock(dlg); /* Attach call data to invite session */ call->inv->mod_data[mod_siprtp.id] = call; -- cgit v1.2.3