[Asterisk-code-review] Fix shutdown crash caused by modules being left open. (asterisk[master])

Anonymous Coward asteriskteam at digium.com
Fri Oct 28 16:21:50 CDT 2016


Anonymous Coward #1000019 has submitted this change and it was merged. ( https://gerrit.asterisk.org/4220 )

Change subject: Fix shutdown crash caused by modules being left open.
......................................................................


Fix shutdown crash caused by modules being left open.

It is only safe to run ast_register_cleanup callbacks when all modules
have been unloaded.  Previously these callbacks were run during graceful
shutdown, making it possible to crash during shutdown.

ASTERISK-26513 #close

Change-Id: Ibfa635bb688d1227ec54aa211d90d6bd45052e21
---
M include/asterisk/_private.h
M include/asterisk/module.h
M main/asterisk.c
M main/loader.c
4 files changed, 8 insertions(+), 10 deletions(-)

Approvals:
  George Joseph: Looks good to me, approved
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, but someone else must approve



diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h
index 36b316f..b3c2b20 100644
--- a/include/asterisk/_private.h
+++ b/include/asterisk/_private.h
@@ -16,6 +16,7 @@
 #define _ASTERISK__PRIVATE_H
 
 int load_modules(unsigned int);		/*!< Provided by loader.c */
+int modules_shutdown(void);		/*!< Provided by loader.c */
 int load_pbx(void);			/*!< Provided by pbx.c */
 int load_pbx_builtins(void);	/*!< Provided by pbx_builtins.c */
 int load_pbx_functions_cli(void);	/*!< Provided by pbx_functions.c */
diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index d5616e9..a80c7f8 100644
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -228,13 +228,6 @@
  */
 int ast_loader_unregister(int (*updater)(void));
 
-/*!
- * \brief Run the unload() callback for all loaded modules
- *
- * This function should be called when Asterisk is shutting down gracefully.
- */
-void ast_module_shutdown(void);
-
 /*! 
  * \brief Match modules names for the Asterisk cli.
  * \param line Unused by this function, but this should be the line we are
diff --git a/main/asterisk.c b/main/asterisk.c
index d4b39a2..56fc107 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -2010,8 +2010,9 @@
 	struct ast_json *json_object = NULL;
 	int run_cleanups = niceness >= SHUTDOWN_NICE;
 
-	if (run_cleanups) {
-		ast_module_shutdown();
+	if (run_cleanups && modules_shutdown()) {
+		ast_verb(0, "Some modules could not be unloaded, switching to fast shutdown\n");
+		run_cleanups = 0;
 	}
 
 	if (!restart) {
diff --git a/main/loader.c b/main/loader.c
index 6617783..dacfce1 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -607,7 +607,7 @@
 
 #endif
 
-void ast_module_shutdown(void)
+int modules_shutdown(void)
 {
 	struct ast_module *mod;
 	int somethingchanged = 1, final = 0;
@@ -655,7 +655,10 @@
 		}
 	} while (somethingchanged && !final);
 
+	final = AST_DLLIST_EMPTY(&module_list);
 	AST_DLLIST_UNLOCK(&module_list);
+
+	return !final;
 }
 
 int ast_unload_resource(const char *resource_name, enum ast_module_unload_mode force)

-- 
To view, visit https://gerrit.asterisk.org/4220
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ibfa635bb688d1227ec54aa211d90d6bd45052e21
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Corey Farrell <git at cfware.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>



More information about the asterisk-code-review mailing list