diff options
author | Liong Sauw Ming <ming@teluu.com> | 2015-02-13 11:34:26 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2015-02-13 11:34:26 +0000 |
commit | c9bab641070e1f4a16a0600eff1dc04a3389fc4b (patch) | |
tree | 8a5a83355262d530485e8c1481176abecb39ce57 /pjnath | |
parent | 33ccbcef51df23a167a5411ca97e7cdd9b604652 (diff) |
Fixed #1815: Race condition of STUN transaction destruction
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4983 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r-- | pjnath/include/pjnath/stun_transaction.h | 11 | ||||
-rw-r--r-- | pjnath/src/pjnath/stun_session.c | 8 | ||||
-rw-r--r-- | pjnath/src/pjnath/stun_transaction.c | 10 |
3 files changed, 28 insertions, 1 deletions
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 @@ -162,6 +162,17 @@ pj_stun_client_tsx_schedule_destroy(pj_stun_client_tsx *tsx, /** + * 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. * * @param tsx The STUN 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. */ |