From 96a4b257bd10ab5aaa6f25a0716a0f521a2bf5a0 Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Fri, 6 Jul 2012 14:32:30 +0000
Subject: [PATCH] Import revision 4196 from pjproject trunk. Fix a crash issue
 when starting ICE connectivity checks and immediately destroying the ICE
 session. This was exposed by the SIP CCSS test.

Full fix for this issue will be worked on as a medium to long term roadmap item.

pjroject issue viewable at https://trac.pjsip.org/repos/ticket/1548


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@369703 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 res/pjproject/pjnath/include/pjnath/ice_session.h |  1 +
 res/pjproject/pjnath/src/pjnath/ice_session.c     | 10 ++++++++++
 2 files changed, 11 insertions(+)

diff --git a/res/pjproject/pjnath/include/pjnath/ice_session.h b/res/pjproject/pjnath/include/pjnath/ice_session.h
index cf153728a3..f48e12d419 100644
--- a/res/pjproject/pjnath/include/pjnath/ice_session.h
+++ b/res/pjproject/pjnath/include/pjnath/ice_session.h
@@ -619,6 +619,7 @@ struct pj_ice_sess
     pj_uint8_t		*prefs;			    /**< Type preference.   */
     pj_bool_t		 is_nominating;		    /**< Nominating stage   */
     pj_bool_t		 is_complete;		    /**< Complete?	    */
+    pj_bool_t		 is_destroying;		    /**< Destroy is called  */
     pj_status_t		 ice_status;		    /**< Error status.	    */
     pj_timer_entry	 timer;			    /**< ICE timer.	    */
     pj_ice_sess_cb	 cb;			    /**< Callback.	    */
diff --git a/res/pjproject/pjnath/src/pjnath/ice_session.c b/res/pjproject/pjnath/src/pjnath/ice_session.c
index bf94e54517..40e10d558b 100644
--- a/res/pjproject/pjnath/src/pjnath/ice_session.c
+++ b/res/pjproject/pjnath/src/pjnath/ice_session.c
@@ -455,6 +455,8 @@ static void destroy_ice(pj_ice_sess *ice,
 	LOG4((ice->obj_name, "Destroying ICE session"));
     }
 
+    ice->is_destroying = PJ_TRUE;
+
     /* Let other callbacks finish */
     if (ice->mutex) {
 	pj_mutex_lock(ice->mutex);
@@ -1840,8 +1842,16 @@ static pj_status_t start_periodic_check(pj_timer_heap_t *th,
     ice = td->ice;
     clist = td->clist;
 
+    if (ice->is_destroying)
+	return PJ_SUCCESS;
+
     pj_mutex_lock(ice->mutex);
 
+    if (ice->is_destroying) {
+	pj_mutex_unlock(ice->mutex);
+	return PJ_SUCCESS;
+    }
+
     /* Set timer ID to FALSE first */
     te->id = PJ_FALSE;
 
-- 
GitLab