From c9bab641070e1f4a16a0600eff1dc04a3389fc4b Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Fri, 13 Feb 2015 11:34:26 +0000 Subject: Fixed #1815: Race condition of STUN transaction destruction git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4983 74dad513-b988-da41-8d7b-12977e46ad98 --- pjnath/include/pjnath/stun_transaction.h | 11 +++++++++++ pjnath/src/pjnath/stun_session.c | 8 +++++++- pjnath/src/pjnath/stun_transaction.c | 10 ++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pjnath/include/pjnath/stun_transaction.h b/pjnath/include/pjnath/stun_transaction.h index 41344aa0..43740106 100644 --- a/pjnath/include/pjnath/stun_transaction.h +++ b/pjnath/include/pjnath/stun_transaction.h @@ -161,6 +161,17 @@ pj_stun_client_tsx_schedule_destroy(pj_stun_client_tsx *tsx, const pj_time_val *delay); +/** + * Destroy the STUN transaction immediately after the transaction is complete. + * Application normally calls this function in the on_complete() callback. + * + * @param tsx The STUN transaction. + * + * @return PJ_SUCCESS on success, or the appropriate error code. + */ +PJ_DECL(pj_status_t) pj_stun_client_tsx_destroy(pj_stun_client_tsx *tsx); + + /** * Stop the client transaction. * diff --git a/pjnath/src/pjnath/stun_session.c b/pjnath/src/pjnath/stun_session.c index 96959738..e7dfa582 100644 --- a/pjnath/src/pjnath/stun_session.c +++ b/pjnath/src/pjnath/stun_session.c @@ -149,10 +149,16 @@ static void stun_tsx_on_destroy(pj_stun_client_tsx *tsx) tdata = (pj_stun_tx_data*) pj_stun_client_tsx_get_data(tsx); pj_stun_client_tsx_stop(tsx); if (tdata) { - tsx_erase(tdata->sess, tdata); + pj_stun_session *sess = tdata->sess; + + pj_grp_lock_acquire(sess->grp_lock); + tsx_erase(sess, tdata); pj_pool_release(tdata->pool); + pj_grp_lock_release(sess->grp_lock); } + pj_stun_client_tsx_destroy(tsx); + TRACE_((THIS_FILE, "STUN transaction %p destroyed", tsx)); } diff --git a/pjnath/src/pjnath/stun_transaction.c b/pjnath/src/pjnath/stun_transaction.c index 586ea555..e9be0278 100644 --- a/pjnath/src/pjnath/stun_transaction.c +++ b/pjnath/src/pjnath/stun_transaction.c @@ -138,6 +138,16 @@ PJ_DEF(pj_status_t) pj_stun_client_tsx_schedule_destroy( } +PJ_DEF(pj_status_t) pj_stun_client_tsx_destroy(pj_stun_client_tsx *tsx) +{ + /* + * Currently tsx has no objects to destroy so we don't need to do anything + * here. + */ + /* pj_stun_client_tsx_stop(tsx); */ + return PJ_SUCCESS; +} + /* * Destroy transaction immediately. */ -- cgit v1.2.3