diff options
author | Riza Sulistyo <riza@teluu.com> | 2014-09-22 07:08:14 +0000 |
---|---|---|
committer | Riza Sulistyo <riza@teluu.com> | 2014-09-22 07:08:14 +0000 |
commit | e35a31561e00b573aca6e9c693b0271019089a1a (patch) | |
tree | 16b2d7f455171418ff14daa03fe7a0da4a47d8a9 /pjsip | |
parent | 74e9fd84c72a87cc00e659eddb34b4f8f970a7b8 (diff) |
Fixed #1791: Fixed possible crash when trying to cancel sdp negotiation upon receiving UPDATE response.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4926 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index 0c08f076..73bbf3d5 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -162,6 +162,7 @@ struct tsx_inv_data pj_bool_t retrying; /* Resend (e.g. due to 401/407) */ pj_str_t done_tag; /* To tag in RX response with answer */ pj_bool_t done_early;/* Negotiation was done for early med? */ + pj_bool_t has_sdp; /* Message with SDP? */ }; /* @@ -713,6 +714,40 @@ static void mod_inv_on_tsx_state(pjsip_transaction *tsx, pjsip_event *e) } } +/* + * Check if tx_data has sdp. + */ +static pj_bool_t tx_data_has_sdp(const pjsip_tx_data *tdata) +{ + pjsip_msg_body *body = tdata->msg->body; + pjsip_media_type app_sdp; + + PJ_ASSERT_RETURN(tdata, PJ_FALSE); + + pjsip_media_type_init2(&app_sdp, "application", "sdp"); + + if (body && + pj_stricmp(&body->content_type.type, &app_sdp.type)==0 && + pj_stricmp(&body->content_type.subtype, &app_sdp.subtype)==0) + { + return PJ_TRUE; + + } else if (body && + pj_stricmp2(&body->content_type.type, "multipart") && + (pj_stricmp2(&body->content_type.subtype, "mixed")==0 || + pj_stricmp2(&body->content_type.subtype, "alternative")==0)) + { + pjsip_multipart_part *part; + + part = pjsip_multipart_find_part(body, &app_sdp, NULL); + if (part) { + return PJ_TRUE; + } + } + + return PJ_FALSE; +} + /* * Initialize the invite module. @@ -1495,6 +1530,7 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, /* Attach our data to the transaction. */ tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL); inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; /* Create 100rel handler */ @@ -1851,6 +1887,7 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv, if (tsx_inv_data == NULL) { tsx_inv_data = PJ_POOL_ZALLOC_T(tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL); tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; } @@ -3058,6 +3095,7 @@ PJ_DEF(pj_status_t) pjsip_inv_send_msg( pjsip_inv_session *inv, /* Associate our data in outgoing invite transaction */ tsx_inv_data = PJ_POOL_ZALLOC_T(inv->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = tx_data_has_sdp(tdata); pjsip_dlg_dec_lock(inv->dlg); @@ -3493,7 +3531,7 @@ static pj_bool_t inv_handle_update_response( pjsip_inv_session *inv, if (pjmedia_sdp_neg_get_state(inv->neg) == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE && - !tsx_inv_data->retrying) + !tsx_inv_data->retrying && tsx_inv_data->has_sdp) { pjmedia_sdp_neg_cancel_offer(inv->neg); @@ -3569,6 +3607,7 @@ static void inv_respond_incoming_prack(pjsip_inv_session *inv, tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; + tsx_inv_data->has_sdp = PJ_TRUE; inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; } |