summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2013-04-08 15:38:34 +0000
committerMatthew Jordan <mjordan@digium.com>2013-04-08 15:38:34 +0000
commita5df2542c34544d4a274303c0c26581dbca5c301 (patch)
treeb04f265c3e97be56492e65b4a48a6eb572c0ac93 /res
parentb8d4e573f1292688d07063542d263490536c2bc9 (diff)
Don't attempt a websocket protocol removal if res_http_websocket isn't there
This patch sets the protocols container provided by res_http_websocket to NULL when the module gets unloaded and adds the necessary checks when adding/ removing a websocket protocol. This prevents some FRACKing on an invalid pointer to the disposed container if a module that uses res_http_websocket is unloaded after it. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@384942 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_http_websocket.c9
-rw-r--r--res/res_stasis_websocket.c7
2 files changed, 13 insertions, 3 deletions
diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c
index cfc6d16f5..15ff8fa45 100644
--- a/res/res_http_websocket.c
+++ b/res/res_http_websocket.c
@@ -122,6 +122,10 @@ int AST_OPTIONAL_API_NAME(ast_websocket_add_protocol)(const char *name, ast_webs
{
struct websocket_protocol *protocol;
+ if (!protocols) {
+ return -1;
+ }
+
ao2_lock(protocols);
/* Ensure a second protocol handler is not registered for the same protocol */
@@ -157,6 +161,10 @@ int AST_OPTIONAL_API_NAME(ast_websocket_remove_protocol)(const char *name, ast_w
{
struct websocket_protocol *protocol;
+ if (!protocols) {
+ return -1;
+ }
+
if (!(protocol = ao2_find(protocols, name, OBJ_KEY))) {
return -1;
}
@@ -670,6 +678,7 @@ static int unload_module(void)
ast_websocket_remove_protocol("echo", websocket_echo_callback);
ast_http_uri_unlink(&websocketuri);
ao2_ref(protocols, -1);
+ protocols = NULL;
return 0;
}
diff --git a/res/res_stasis_websocket.c b/res/res_stasis_websocket.c
index b4819aec9..bfaeea07c 100644
--- a/res/res_stasis_websocket.c
+++ b/res/res_stasis_websocket.c
@@ -305,7 +305,7 @@ static int load_module(void)
/* ironic */
return AST_MODULE_LOAD_FAILURE;
}
- r |= ast_websocket_add_protocol(ws_protocol, websocket_callback);
+ r |= ast_websocket_add_protocol(ws_protocol, websocket_callback);
return r;
}
@@ -315,12 +315,13 @@ static int unload_module(void)
ast_json_unref(oom_json);
oom_json = NULL;
- r |= ast_websocket_remove_protocol(ws_protocol, websocket_callback);
+ r |= ast_websocket_remove_protocol(ws_protocol, websocket_callback);
return r;
}
AST_MODULE_INFO(ASTERISK_GPL_KEY, 0, "Stasis HTTP bindings",
.load = load_module,
.unload = unload_module,
- .nonoptreq = "app_stasis,res_http_websocket"
+ .nonoptreq = "app_stasis,res_http_websocket",
+ .load_pri = AST_MODPRI_APP_DEPEND,
);