summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-04-14 02:57:29 +0000
committerBenny Prijono <bennylp@teluu.com>2008-04-14 02:57:29 +0000
commita16dbe29358fbe42ded721c9de52ddfae42d2c92 (patch)
tree0ea7287a6db18f525066b1af7a5bc55a9ab17c56 /pjsip
parent3f1098a6c493dc05999bb28301c13ae81cab3d73 (diff)
Ticket #525: Crash on call update or re-invite (Thanks Alexey)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1928 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c59
1 files changed, 29 insertions, 30 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index d50667ce..2d6e2243 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -782,41 +782,38 @@ pj_status_t pjsua_media_channel_init(pjsua_call_id call_id,
return PJ_EBUSY;
}
- /* Stop media transport (for good measure!) */
- pjmedia_transport_media_stop(call->med_tp);
-
- /* Close upper entry of transport stack */
- if (call->med_orig && (call->med_tp != call->med_orig)) {
- pjmedia_transport_close(call->med_tp);
- call->med_tp = call->med_orig;
- }
-
#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
- /* Check if SRTP requires secure signaling */
- if (acc->cfg.use_srtp != PJMEDIA_SRTP_DISABLED) {
- if (security_level < acc->cfg.srtp_secure_signaling) {
+ /* This function may be called when SRTP transport already exists
+ * (e.g: in re-invite, update), don't need to destroy/re-create.
+ */
+ if (!call->med_orig || call->med_tp == call->med_orig) {
+
+ /* Check if SRTP requires secure signaling */
+ if (acc->cfg.use_srtp != PJMEDIA_SRTP_DISABLED) {
+ if (security_level < acc->cfg.srtp_secure_signaling) {
+ if (sip_err_code)
+ *sip_err_code = PJSIP_SC_NOT_ACCEPTABLE;
+ return PJSIP_ESESSIONINSECURE;
+ }
+ }
+
+ /* Always create SRTP adapter */
+ pjmedia_srtp_setting_default(&srtp_opt);
+ srtp_opt.close_member_tp = PJ_FALSE;
+ srtp_opt.use = acc->cfg.use_srtp;
+ status = pjmedia_transport_srtp_create(pjsua_var.med_endpt,
+ call->med_tp,
+ &srtp_opt, &srtp);
+ if (status != PJ_SUCCESS) {
if (sip_err_code)
- *sip_err_code = PJSIP_SC_NOT_ACCEPTABLE;
- return PJSIP_ESESSIONINSECURE;
+ *sip_err_code = PJSIP_SC_INTERNAL_SERVER_ERROR;
+ return status;
}
- }
- /* Always create SRTP adapter */
- pjmedia_srtp_setting_default(&srtp_opt);
- srtp_opt.close_member_tp = PJ_FALSE;
- srtp_opt.use = acc->cfg.use_srtp;
- status = pjmedia_transport_srtp_create(pjsua_var.med_endpt,
- call->med_tp,
- &srtp_opt, &srtp);
- if (status != PJ_SUCCESS) {
- if (sip_err_code)
- *sip_err_code = PJSIP_SC_INTERNAL_SERVER_ERROR;
- return status;
+ /* Set SRTP as current media transport */
+ call->med_orig = call->med_tp;
+ call->med_tp = srtp;
}
-
- /* Set SRTP as current media transport */
- call->med_orig = call->med_tp;
- call->med_tp = srtp;
#else
call->med_orig = call->med_tp;
PJ_UNUSED_ARG(security_level);
@@ -902,6 +899,8 @@ static void stop_media_session(pjsua_call_id call_id)
{
pjsua_call *call = &pjsua_var.calls[call_id];
+ pjmedia_transport_media_stop(call->med_tp);
+
if (call->conf_slot != PJSUA_INVALID_ID) {
pjmedia_conf_remove_port(pjsua_var.mconf, call->conf_slot);
call->conf_slot = PJSUA_INVALID_ID;