[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