From: Corey Farrell Date: Wed, 3 Aug 2016 20:38:21 +0000 (-0400) Subject: Add missing checks during startup. X-Git-Tag: 11.24.0-rc1~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fchanges%2F10%2F3410%2F1;p=thirdparty%2Fasterisk.git 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 --- 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 ---*/