From 3c9b57a58e391b5b13752194c836c87aad626884 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 8 Feb 2012 09:29:38 +0000 Subject: Fix #1451: Don't hold the ICE session's mutex when calling pj_ice_sess_cb::on_tx_pkt() callback to avoid deadlock. git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@3951 74dad513-b988-da41-8d7b-12977e46ad98 --- pjnath/src/pjnath/ice_session.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'pjnath') diff --git a/pjnath/src/pjnath/ice_session.c b/pjnath/src/pjnath/ice_session.c index d6fae822..8725ce12 100644 --- a/pjnath/src/pjnath/ice_session.c +++ b/pjnath/src/pjnath/ice_session.c @@ -2823,6 +2823,8 @@ PJ_DEF(pj_status_t) pj_ice_sess_send_data(pj_ice_sess *ice, pj_status_t status = PJ_SUCCESS; pj_ice_sess_comp *comp; pj_ice_sess_cand *cand; + pj_uint8_t transport_id; + pj_sockaddr addr; PJ_ASSERT_RETURN(ice && comp_id, PJ_EINVAL); @@ -2838,22 +2840,29 @@ PJ_DEF(pj_status_t) pj_ice_sess_send_data(pj_ice_sess *ice, comp = find_comp(ice, comp_id); if (comp == NULL) { status = PJNATH_EICEINCOMPID; + pj_mutex_unlock(ice->mutex); goto on_return; } if (comp->valid_check == NULL) { status = PJNATH_EICEINPROGRESS; + pj_mutex_unlock(ice->mutex); goto on_return; } cand = comp->valid_check->lcand; - status = (*ice->cb.on_tx_pkt)(ice, comp_id, cand->transport_id, + transport_id = cand->transport_id; + pj_sockaddr_cp(&addr, &comp->valid_check->rcand->addr); + + /* Release the mutex now to avoid deadlock (see ticket #1451). */ + pj_mutex_unlock(ice->mutex); + + status = (*ice->cb.on_tx_pkt)(ice, comp_id, transport_id, data, data_len, - &comp->valid_check->rcand->addr, + &addr, sizeof(pj_sockaddr_in)); on_return: - pj_mutex_unlock(ice->mutex); return status; } -- cgit v1.2.3