From c7612521be34e912b208de406255c4b2967947a0 Mon Sep 17 00:00:00 2001 From: Naveen Albert <asterisk@phreaknet.org> Date: Tue, 3 May 2022 12:53:28 +0000 Subject: [PATCH] cli: Prevent assertions on startup from bad ao2 refs. If "core show channels" is run before startup has completed, it is possible for bad ao2 refs to occur because the system is not yet fully initialized. This will lead to an assertion failing. To prevent this, initialization of CLI builtins is moved to be later along in the main load sequence. Core CLI commands are loaded at the same time, but channel-related commands are loaded later on. ASTERISK-29846 #close Change-Id: If6b3cde802876bd738c1b4cf2683bea6ddc615b6 --- include/asterisk/_private.h | 1 + main/asterisk.c | 1 + main/cli.c | 44 ++++++++++++++++++------------------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h index 4f81421f3a..65e403fb49 100644 --- a/include/asterisk/_private.h +++ b/include/asterisk/_private.h @@ -37,6 +37,7 @@ int ast_term_init(void); /*!< Provided by term.c */ int astdb_init(void); /*!< Provided by db.c */ int ast_channels_init(void); /*!< Provided by channel.c */ void ast_builtins_init(void); /*!< Provided by cli.c */ +void ast_cli_channels_init(void); /*!< Provided by cli.c */ int ast_cli_perms_init(int reload); /*!< Provided by cli.c */ void dnsmgr_start_refresh(void); /*!< Provided by dnsmgr.c */ int ast_dns_system_resolver_init(void); /*!< Provided by dns_system_resolver.c */ diff --git a/main/asterisk.c b/main/asterisk.c index 2d70c53abd..dea849f10c 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -4269,6 +4269,7 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou /* loads the cli_permissions.conf file needed to implement cli restrictions. */ ast_cli_perms_init(0); + ast_cli_channels_init(); /* Not always safe to access CLI commands until startup is complete. */ ast_stun_init(); diff --git a/main/cli.c b/main/cli.c index 0c119531a6..03863358df 100644 --- a/main/cli.c +++ b/main/cli.c @@ -2016,50 +2016,27 @@ static char *handle_help(struct ast_cli_entry *e, int cmd, struct ast_cli_args * static struct ast_cli_entry cli_cli[] = { AST_CLI_DEFINE(handle_commandmatchesarray, "Returns command matches array"), - AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"), - - AST_CLI_DEFINE(handle_chanlist, "Display information on channels"), - - AST_CLI_DEFINE(handle_showcalls, "Display information on calls"), - - AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"), - - AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"), - AST_CLI_DEFINE(handle_debug_category, "Enable/disable debugging categories"), AST_CLI_DEFINE(handle_debug, "Set level of debug chattiness"), AST_CLI_DEFINE(handle_trace, "Set level of trace chattiness"), AST_CLI_DEFINE(handle_verbose, "Set level of verbose chattiness"), - AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"), - AST_CLI_DEFINE(handle_help, "Display help list, or specific help on a command"), - AST_CLI_DEFINE(handle_logger_mute, "Toggle logging output to a console"), AST_CLI_DEFINE(handle_modlist, "List modules and info"), - AST_CLI_DEFINE(handle_load, "Load a module by name"), - AST_CLI_DEFINE(handle_reload, "Reload configuration for a module"), - AST_CLI_DEFINE(handle_core_reload, "Global reload"), - AST_CLI_DEFINE(handle_unload, "Unload a module by name"), - AST_CLI_DEFINE(handle_refresh, "Completely unloads and loads a module by name"), AST_CLI_DEFINE(handle_showuptime, "Show uptime information"), - AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"), - AST_CLI_DEFINE(handle_cli_reload_permissions, "Reload CLI permissions config"), - AST_CLI_DEFINE(handle_cli_show_permissions, "Show CLI permissions"), - AST_CLI_DEFINE(handle_cli_check_permissions, "Try a permissions config for a user"), - AST_CLI_DEFINE(handle_cli_wait_fullybooted, "Wait for Asterisk to be fully booted"), #ifdef HAVE_MALLOC_TRIM @@ -2068,6 +2045,16 @@ static struct ast_cli_entry cli_cli[] = { }; +static struct ast_cli_entry cli_channels_cli[] = { + AST_CLI_DEFINE(handle_nodebugchan_deprecated, "Disable debugging on channel(s)"), + AST_CLI_DEFINE(handle_chanlist, "Display information on channels"), + AST_CLI_DEFINE(handle_showcalls, "Display information on calls"), + AST_CLI_DEFINE(handle_showchan, "Display information on a specific channel"), + AST_CLI_DEFINE(handle_core_set_debug_channel, "Enable/disable debugging on a channel"), + AST_CLI_DEFINE(group_show_channels, "Display active channels with group(s)"), + AST_CLI_DEFINE(handle_softhangup, "Request a hangup on a given channel"), +}; + /*! * Some regexp characters in cli arguments are reserved and used as separators. */ @@ -2239,6 +2226,11 @@ static void cli_shutdown(void) ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli)); } +static void cli_channels_shutdown(void) +{ + ast_cli_unregister_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli)); +} + /*! \brief initialize the _full_cmd string in * each of the builtins. */ void ast_builtins_init(void) { @@ -2247,6 +2239,12 @@ void ast_builtins_init(void) ast_register_cleanup(cli_shutdown); } +void ast_cli_channels_init(void) +{ + ast_cli_register_multiple(cli_channels_cli, ARRAY_LEN(cli_channels_cli)); + ast_register_cleanup(cli_channels_shutdown); +} + /*! * match a word in the CLI entry. * returns -1 on mismatch, 0 on match of an optional word, -- GitLab