From a5df2542c34544d4a274303c0c26581dbca5c301 Mon Sep 17 00:00:00 2001
From: Matthew Jordan <mjordan@digium.com>
Date: Mon, 8 Apr 2013 15:38:34 +0000
Subject: [PATCH] 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
---
 res/res_http_websocket.c   | 9 +++++++++
 res/res_stasis_websocket.c | 7 ++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c
index cfc6d16f5d..15ff8fa456 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 b4819aec99..bfaeea07ce 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,
         );
-- 
GitLab