summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-01-12 10:06:04 +0000
committerBenny Prijono <bennylp@teluu.com>2009-01-12 10:06:04 +0000
commit70249012a6292c4c01c9de268f08f4a6fe443063 (patch)
treed2ac312ed423f646e058c1c23f3698ca221b9d00
parent4bdd22b8236889af38b311599472b13a51490b79 (diff)
Fixed ticket #689: Deadlock caused by ICE media transport (thanks Alain Totouom for the report)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2419 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjnath/src/pjnath/ice_session.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/pjnath/src/pjnath/ice_session.c b/pjnath/src/pjnath/ice_session.c
index 8814da70..f5ba8e3c 100644
--- a/pjnath/src/pjnath/ice_session.c
+++ b/pjnath/src/pjnath/ice_session.c
@@ -2457,7 +2457,6 @@ PJ_DEF(pj_status_t) pj_ice_sess_on_rx_pkt(pj_ice_sess *ice,
pj_ice_sess_comp *comp;
pj_ice_msg_data *msg_data = NULL;
unsigned i;
- pj_status_t stun_status;
PJ_ASSERT_RETURN(ice, PJ_EINVAL);
@@ -2465,8 +2464,8 @@ PJ_DEF(pj_status_t) pj_ice_sess_on_rx_pkt(pj_ice_sess *ice,
comp = find_comp(ice, comp_id);
if (comp == NULL) {
- status = PJNATH_EICEINCOMPID;
- goto on_return;
+ pj_mutex_unlock(ice->mutex);
+ return PJNATH_EICEINCOMPID;
}
/* Find transport */
@@ -2478,13 +2477,13 @@ PJ_DEF(pj_status_t) pj_ice_sess_on_rx_pkt(pj_ice_sess *ice,
}
if (msg_data == NULL) {
pj_assert(!"Invalid transport ID");
- status = PJ_EINVAL;
- goto on_return;
+ pj_mutex_unlock(ice->mutex);
+ return PJ_EINVAL;
}
- stun_status = pj_stun_msg_check((const pj_uint8_t*)pkt, pkt_size,
- PJ_STUN_IS_DATAGRAM);
- if (stun_status == PJ_SUCCESS) {
+ status = pj_stun_msg_check((const pj_uint8_t*)pkt, pkt_size,
+ PJ_STUN_IS_DATAGRAM);
+ if (status == PJ_SUCCESS) {
status = pj_stun_session_on_rx_pkt(comp->stun_sess, pkt, pkt_size,
PJ_STUN_IS_DATAGRAM, msg_data,
NULL, src_addr, src_addr_len);
@@ -2493,14 +2492,18 @@ PJ_DEF(pj_status_t) pj_ice_sess_on_rx_pkt(pj_ice_sess *ice,
LOG4((ice->obj_name, "Error processing incoming message: %s",
ice->tmp.errmsg));
}
+ pj_mutex_unlock(ice->mutex);
} else {
+ /* Not a STUN packet. Call application's callback instead, but release
+ * the mutex now or otherwise we may get deadlock.
+ */
+ pj_mutex_unlock(ice->mutex);
+
(*ice->cb.on_rx_data)(ice, comp_id, transport_id, pkt, pkt_size,
src_addr, src_addr_len);
+ status = PJ_SUCCESS;
}
-
-on_return:
- pj_mutex_unlock(ice->mutex);
return status;
}