[asterisk-commits] mjordan: trunk r426997 - in /trunk: ./ res/res_stasis.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Nov 1 20:01:54 CDT 2014


Author: mjordan
Date: Sat Nov  1 20:01:52 2014
New Revision: 426997

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=426997
Log:
res/res_stasis: Fix crash on module unload while performing operation

When the res_stasis module is unloaded, it will dispose of the apps_registry
container. This is a problem if an ARI operation is in flight that attempts
to use the registry, as the shutdown occurs in a separate thread. This patch
adds some sanity checks to the various routines that access the registry which
cause the operations to fail if the apps_registry does not exist.

Crash caught by the Asterisk Test Suite.
........

Merged revisions 426995 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 426996 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    trunk/   (props changed)
    trunk/res/res_stasis.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/res/res_stasis.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_stasis.c?view=diff&rev=426997&r1=426996&r2=426997
==============================================================================
--- trunk/res/res_stasis.c (original)
+++ trunk/res/res_stasis.c Sat Nov  1 20:01:52 2014
@@ -1204,6 +1204,10 @@
 	 */
 	remove_stasis_end_published(chan);
 
+	if (!apps_registry) {
+		return -1;
+	}
+
 	app = ao2_find(apps_registry, app_name, OBJ_SEARCH_KEY);
 	if (!app) {
 		ast_log(LOG_ERROR,
@@ -1364,6 +1368,10 @@
 {
 	RAII_VAR(struct stasis_app *, app, NULL, ao2_cleanup);
 
+	if (!apps_registry) {
+		return -1;
+	}
+
 	app = ao2_find(apps_registry, app_name, OBJ_SEARCH_KEY);
 	if (!app) {
 		/* XXX We can do a better job handling late binding, queueing up
@@ -1381,6 +1389,10 @@
 {
 	struct stasis_app *res = NULL;
 
+	if (!apps_registry) {
+		return NULL;
+	}
+
 	if (!ast_strlen_zero(app_name)) {
 		res = ao2_find(apps_registry, app_name, OBJ_SEARCH_KEY);
 	}
@@ -1405,6 +1417,10 @@
 {
 	RAII_VAR(struct ao2_container *, apps, NULL, ao2_cleanup);
 
+	if (!apps_registry) {
+		return NULL;
+	}
+
 	apps = ast_str_container_alloc(1);
 	if (!apps) {
 		return NULL;
@@ -1419,8 +1435,11 @@
 {
 	RAII_VAR(struct stasis_app *, app, NULL, ao2_cleanup);
 
-	SCOPED_LOCK(apps_lock, apps_registry, ao2_lock, ao2_unlock);
-
+	if (!apps_registry) {
+		return -1;
+	}
+
+	ao2_lock(apps_registry);
 	app = ao2_find(apps_registry, app_name, OBJ_SEARCH_KEY | OBJ_NOLOCK);
 	if (app) {
 		app_update(app, handler, data);
@@ -1429,6 +1448,7 @@
 		if (app) {
 			ao2_link_flags(apps_registry, app, OBJ_NOLOCK);
 		} else {
+			ao2_unlock(apps_registry);
 			return -1;
 		}
 	}
@@ -1437,6 +1457,7 @@
 	 * prevent memory leaks, and we're lazy.
 	 */
 	cleanup();
+	ao2_unlock(apps_registry);
 	return 0;
 }
 
@@ -1445,6 +1466,10 @@
 	RAII_VAR(struct stasis_app *, app, NULL, ao2_cleanup);
 
 	if (!app_name) {
+		return;
+	}
+
+	if (!apps_registry) {
 		return;
 	}
 
@@ -1841,6 +1866,7 @@
 
 	messaging_cleanup();
 
+	cleanup();
 	ao2_cleanup(apps_registry);
 	apps_registry = NULL;
 




More information about the asterisk-commits mailing list