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
changes/20/4220/1
Corey Farrell 9 years ago
parent 0ec5abe592
commit d6ad867897

@ -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 */

@ -228,13 +228,6 @@ int ast_loader_register(int (*updater)(void));
*/
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

@ -2010,8 +2010,9 @@ static void really_quit(int num, shutdown_nice_t niceness, int restart)
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) {

@ -607,7 +607,7 @@ static struct ast_module *load_dynamic_module(const char *resource_in, unsigned
#endif
void ast_module_shutdown(void)
int modules_shutdown(void)
{
struct ast_module *mod;
int somethingchanged = 1, final = 0;
@ -655,7 +655,10 @@ void ast_module_shutdown(void)
}
} 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)

Loading…
Cancel
Save