From 52bd5e9eeb13e57188af0e6cbf82fb9c44727409 Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Wed, 3 Aug 2016 16:38:21 -0400 Subject: [PATCH] Add missing checks during startup. This ensures startup is canceled due to allocation failures from the following initializations. * channel.c: ast_channels_init * format.c: ast_format_attr_init and ast_format_list_init ASTERISK-26265 #close Change-Id: I911ed08fa2a3be35de55903e0225957bcdbe9611 --- include/asterisk/_private.h | 2 +- main/asterisk.c | 18 ++++++++++++++---- main/channel.c | 7 ++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h index 1bc24337f0..35bc14a625 100644 --- a/include/asterisk/_private.h +++ b/include/asterisk/_private.h @@ -24,7 +24,7 @@ void clean_time_zones(void); /*!< Provided by localtime.c */ int init_framer(void); /*!< Provided by frame.c */ int ast_term_init(void); /*!< Provided by term.c */ int astdb_init(void); /*!< Provided by db.c */ -void ast_channels_init(void); /*!< Provided by channel.c */ +int ast_channels_init(void); /*!< Provided by channel.c */ void ast_builtins_init(void); /*!< Provided by cli.c */ int ast_cli_perms_init(int reload); /*!< Provided by cli.c */ int dnsmgr_init(void); /*!< Provided by dnsmgr.c */ diff --git a/main/asterisk.c b/main/asterisk.c index 0e33d0ca9d..10f437b771 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -4235,10 +4235,17 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou threadstorage_init(); - ast_format_attr_init(); - ast_format_list_init(); - ast_rtp_engine_init(); + if (ast_format_attr_init()) { + printf("Failed: ast_format_attr_init\n%s", term_quit()); + exit(1); + } + if (ast_format_list_init()) { + printf("Failed: ast_format_list_init\n%s", term_quit()); + exit(1); + } + + ast_rtp_engine_init(); ast_autoservice_init(); if (ast_timing_init()) { @@ -4272,7 +4279,10 @@ static void asterisk_daemon(int isroot, const char *runuser, const char *rungrou exit(1); } - ast_channels_init(); + if (ast_channels_init()) { + printf("Failed: ast_channels_init\n%s", term_quit()); + exit(1); + } if ((moduleresult = load_modules(1))) { /* Load modules, pre-load only */ printf("Failed: load_modules(1)\n%s", term_quit()); diff --git a/main/channel.c b/main/channel.c index af7845a2fe..ecb256531e 100644 --- a/main/channel.c +++ b/main/channel.c @@ -8671,10 +8671,13 @@ static void channels_shutdown(void) } } -void ast_channels_init(void) +int ast_channels_init(void) { channels = ao2_container_alloc(NUM_CHANNEL_BUCKETS, ast_channel_hash_cb, ast_channel_cmp_cb); + if (!channels) { + return -1; + } ast_cli_register_multiple(cli_channel, ARRAY_LEN(cli_channel)); @@ -8683,6 +8686,8 @@ void ast_channels_init(void) ast_plc_reload(); ast_register_cleanup(channels_shutdown); + + return 0; } /*! \brief Print call group and pickup group ---*/ -- 2.47.2