summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2015-02-13 11:34:26 +0000
committerLiong Sauw Ming <ming@teluu.com>2015-02-13 11:34:26 +0000
commitc9bab641070e1f4a16a0600eff1dc04a3389fc4b (patch)
tree8a5a83355262d530485e8c1481176abecb39ce57 /pjnath
parent33ccbcef51df23a167a5411ca97e7cdd9b604652 (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.h11
-rw-r--r--pjnath/src/pjnath/stun_session.c8
-rw-r--r--pjnath/src/pjnath/stun_transaction.c10
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.
*/