summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-07-05 08:00:06 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-07-05 08:00:06 +0000
commit0e1ddc14b4fa4d6edc04736355c94e4094ea1d74 (patch)
tree72b902d64649e757b79923953320c69510a9a92d /pjnath
parent9acdbbbbc844e603f01a4f1efb3e46ca7252df8e (diff)
Fix #1685: When TURN destroy is requested in state RESOLVING, pending the destroy until resolver callback is invoked.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4551 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r--pjnath/src/pjnath/turn_session.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/pjnath/src/pjnath/turn_session.c b/pjnath/src/pjnath/turn_session.c
index 5cecd2e3..42fa6358 100644
--- a/pjnath/src/pjnath/turn_session.c
+++ b/pjnath/src/pjnath/turn_session.c
@@ -120,7 +120,6 @@ struct pj_turn_session
pj_turn_state_t state;
pj_status_t last_status;
pj_bool_t pending_destroy;
- pj_bool_t destroy_notified;
pj_stun_session *stun;
@@ -131,7 +130,6 @@ struct pj_turn_session
pj_timer_heap_t *timer_heap;
pj_timer_entry timer;
- pj_dns_srv_async_query *dns_async;
pj_uint16_t default_port;
pj_uint16_t af;
@@ -395,10 +393,12 @@ static void sess_shutdown(pj_turn_session *sess,
case PJ_TURN_STATE_NULL:
break;
case PJ_TURN_STATE_RESOLVING:
- if (sess->dns_async != NULL) {
- pj_dns_srv_cancel_query(sess->dns_async, PJ_FALSE);
- sess->dns_async = NULL;
- }
+ /* Wait for DNS callback invoked, it will call the this function
+ * again. If the callback happens to get pending_destroy==FALSE,
+ * the TURN allocation will call this function again.
+ */
+ sess->pending_destroy = PJ_TRUE;
+ can_destroy = PJ_FALSE;
break;
case PJ_TURN_STATE_RESOLVED:
break;
@@ -619,7 +619,7 @@ PJ_DEF(pj_status_t) pj_turn_session_set_server( pj_turn_session *sess,
status = pj_dns_srv_resolve(domain, &res_name, default_port,
sess->pool, resolver, opt, sess,
- &dns_srv_resolver_cb, &sess->dns_async);
+ &dns_srv_resolver_cb, NULL);
if (status != PJ_SUCCESS) {
set_state(sess, PJ_TURN_STATE_NULL);
goto on_return;
@@ -1682,11 +1682,9 @@ static void dns_srv_resolver_cb(void *user_data,
pj_turn_session *sess = (pj_turn_session*) user_data;
unsigned i, cnt, tot_cnt;
- /* Clear async resolver */
- sess->dns_async = NULL;
-
/* Check failure */
- if (status != PJ_SUCCESS) {
+ if (status != PJ_SUCCESS || sess->pending_destroy) {
+ set_state(sess, PJ_TURN_STATE_DESTROYING);
sess_shutdown(sess, status);
return;
}