]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Replace most uses of ast_register_atexit with ast_register_cleanup.
authorCorey Farrell <git@cfware.com>
Thu, 26 Mar 2015 22:16:31 +0000 (22:16 +0000)
committerCorey Farrell <git@cfware.com>
Thu, 26 Mar 2015 22:16:31 +0000 (22:16 +0000)
Since 'core stop now' and 'core restart now' do not stop modules,
it is unsafe for most of the core to run cleanups.  Originally all
cleanups used ast_register_atexit, and were only changed when it
was shown to be unsafe.  ast_register_atexit is now used only when
absolutely required to prevent corruption and close child processes.

Exceptions that need to use ast_register_atexit:
* CDR: Flush records.
* res_musiconhold: Kill external applications.
* AstDB: Close the DB.
* canary_exit: Kill canary process.

ASTERISK-24142 #close
Reported by: David Brillert

ASTERISK-24683 #close
Reported by: Peter Katzmann

ASTERISK-24805 #close
Reported by: Badalian Vyacheslav

ASTERISK-24881 #close
Reported by: Corey Farrell

Review: https://reviewboard.asterisk.org/r/4500/
Review: https://reviewboard.asterisk.org/r/4501/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@433495 65c4cc65-6c06-0410-ace0-fbb531ad65f3

33 files changed:
include/asterisk.h
main/aoc.c
main/asterisk.c
main/astfd.c
main/astmm.c
main/astobj2.c
main/ccss.c
main/cel.c
main/channel.c
main/cli.c
main/config.c
main/data.c
main/dnsmgr.c
main/event.c
main/features.c
main/file.c
main/format.c
main/http.c
main/image.c
main/indications.c
main/manager.c
main/message.c
main/named_acl.c
main/pbx.c
main/stun.c
main/taskprocessor.c
main/test.c
main/threadstorage.c
main/timing.c
main/translate.c
main/udptl.c
main/utils.c
main/xmldoc.c

index dc1e521bc6e067eff36ccd87b7c1acc4a4ec245a..0ba913c63be68f5bb78dc406145cd4e1650d5daa 100644 (file)
@@ -86,6 +86,11 @@ int ast_pbx_init(void);                              /*!< Provided by pbx.c */
  *
  * \retval 0 on success.
  * \retval -1 on error.
+ *
+ * \note This function should be rarely used in situations where
+ * something must be shutdown to avoid corruption, excessive data
+ * loss, or when external programs must be stopped.  All other
+ * cleanup in the core should use ast_register_cleanup.
  */
 int ast_register_atexit(void (*func)(void));
 
index 1e21dd82075546030b764c2ca0d8444ceca31348..a9e6d7bedb01c478fc8c20fc811e3e247fcbedf3 100644 (file)
@@ -1611,6 +1611,6 @@ static void aoc_shutdown(void)
 }
 int ast_aoc_cli_init(void)
 {
-       ast_register_atexit(aoc_shutdown);
+       ast_register_cleanup(aoc_shutdown);
        return ast_cli_register_multiple(aoc_cli, ARRAY_LEN(aoc_cli));
 }
index 55d35e2387e002bcdd4712d42cb35981f6473d5a..ca853635167cfa32dead4d2877a9830c365636a3 100644 (file)
@@ -4374,7 +4374,7 @@ int main(int argc, char *argv[])
        ast_lastreloadtime = ast_startuptime = ast_tvnow();
        ast_cli_register_multiple(cli_asterisk_shutdown, ARRAY_LEN(cli_asterisk_shutdown));
        ast_cli_register_multiple(cli_asterisk, ARRAY_LEN(cli_asterisk));
-       ast_register_atexit(main_atexit);
+       ast_register_cleanup(main_atexit);
 
        run_startup_commands();
 
index b2dfd12ee61a17b46ddbfc8e795989451391687c..bb658635acd10790df284a4cdb626dc2ed649308 100644 (file)
@@ -281,7 +281,7 @@ static void fd_shutdown(void)
 
 int ast_fd_init(void)
 {
-       ast_register_atexit(fd_shutdown);
+       ast_register_cleanup(fd_shutdown);
        return ast_cli_register(&cli_show_fd);
 }
 
index 5ef5799b86552537c3a61cb0651e18999121c9e6..04feae43edac5e51a65ef3336a6c87275dca9dff 100644 (file)
@@ -1429,7 +1429,7 @@ void __ast_mm_init_phase_2(void)
                ast_log(LOG_ERROR, "Could not open malloc debug log file: %s\n", filename);
        }
 
-       ast_register_atexit(mm_atexit_ast);
+       ast_register_cleanup(mm_atexit_ast);
 }
 
 #endif /* defined(__AST_DEBUG_MALLOC) */
index 6aff3b4ced027c14aacb4537838e186395d4dafd..3128328dbb9d7a952a142a9b49b299f56b2e6dff 100644 (file)
@@ -1748,7 +1748,7 @@ int astobj2_init(void)
        ast_cli_register_multiple(cli_astobj2, ARRAY_LEN(cli_astobj2));
 #endif
 
-       ast_register_atexit(astobj2_cleanup);
+       ast_register_cleanup(astobj2_cleanup);
 
        return 0;
 }
index feee7cc8f47e0c95b9394808994edca16effdaf6..7203889afe99518c25730ea2ee1d40f54da100ef 100644 (file)
@@ -4583,7 +4583,7 @@ int ast_cc_init(void)
        initialize_cc_devstate_map();
        res |= ast_devstate_prov_add("ccss", ccss_device_state);
 
-       ast_register_atexit(cc_shutdown);
+       ast_register_cleanup(cc_shutdown);
 
        return res;
 }
index 83a1b162168d2e482091e601e425caed5fe1c606..ca7186694cb4e952474c6131f6049008a453cf1c 100644 (file)
@@ -892,7 +892,7 @@ int ast_cel_engine_init(void)
                return -1;
        }
 
-       ast_register_atexit(ast_cel_engine_term);
+       ast_register_cleanup(ast_cel_engine_term);
 
        return 0;
 }
index c89cd725e4b69a79e94a04e74d5f658823f4d86b..0d640755ad96100944a4c62e21e72708dbb4f3f4 100644 (file)
@@ -8666,7 +8666,7 @@ void ast_channels_init(void)
 
        ast_plc_reload();
 
-       ast_register_atexit(channels_shutdown);
+       ast_register_cleanup(channels_shutdown);
 }
 
 /*! \brief Print call group and pickup group ---*/
index 4066224913a475d810493ab0b30550cffd1e0831..535c7fca94dbe9b8fc810e803711645d4cf767d5 100644 (file)
@@ -2000,7 +2000,7 @@ static void cli_shutdown(void)
 void ast_builtins_init(void)
 {
        ast_cli_register_multiple(cli_cli, ARRAY_LEN(cli_cli));
-       ast_register_atexit(cli_shutdown);
+       ast_register_cleanup(cli_shutdown);
 }
 
 /*!
index 8f886e079274a6fced6aeb4b33d916bc235d842e..c49f82c977e309cf47a2824cf1e586fee5eed89b 100644 (file)
@@ -3368,7 +3368,7 @@ static void config_shutdown(void)
 int register_config_cli(void)
 {
        ast_cli_register_multiple(cli_config, ARRAY_LEN(cli_config));
-       ast_register_atexit(config_shutdown);
+       ast_register_cleanup(config_shutdown);
        return 0;
 }
 
index e17b80a4b86084554dd0223f1bffb563a63cf52b..8b3846b2e1a7962d0b17b0733cd4dd0be1982f36 100644 (file)
@@ -3343,7 +3343,7 @@ int ast_data_init(void)
 
        AST_TEST_REGISTER(test_data_get);
 
-       ast_register_atexit(data_shutdown);
+       ast_register_cleanup(data_shutdown);
 
        return res;
 }
index 3d01a3157ffa4b95a74dfd014f403a4cc3c8502b..352d6381b072bd33fca99de2794378896e4b2452 100644 (file)
@@ -427,7 +427,7 @@ int dnsmgr_init(void)
        ast_cli_register(&cli_status);
        ast_cli_register(&cli_refresh);
 
-       ast_register_atexit(dnsmgr_shutdown);
+       ast_register_cleanup(dnsmgr_shutdown);
 
        return do_reload(1);
 }
index 317a151bea54d49e4e25a684f3837c15d40cf080..4b2844be2c35825bc57d64cd53eb69fee2b381ce 100644 (file)
@@ -1882,7 +1882,7 @@ int ast_event_init(void)
 
        ast_cli_register_multiple(event_cli, ARRAY_LEN(event_cli));
 
-       ast_register_atexit(event_shutdown);
+       ast_register_cleanup(event_shutdown);
 
        return 0;
 
index 7473e20f3df0e80ac8ad653d5101abecefa3ce76..82b7b2fe9b5d7e93efbde0113380bf75e7de7874 100644 (file)
@@ -9108,7 +9108,7 @@ int ast_features_init(void)
        res |= AST_TEST_REGISTER(features_test);
 #endif /* defined(TEST_FRAMEWORK) */
 
-       ast_register_atexit(features_shutdown);
+       ast_register_cleanup(features_shutdown);
 
        return res;
 }
index 97584a5337e6af85273418c35a74474231041feb..436aae9124cb55c851130b33e6a87955ac60eb3c 100644 (file)
@@ -1594,6 +1594,6 @@ static void file_shutdown(void)
 int ast_file_init(void)
 {
        ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
-       ast_register_atexit(file_shutdown);
+       ast_register_cleanup(file_shutdown);
        return 0;
 }
index 681d1a434422f21fc7ab9f53636d9923b14079cc..e3c5bc5065f04370018327001b5d3f9148768e2c 100644 (file)
@@ -1113,7 +1113,7 @@ int ast_format_list_init(void)
                goto init_list_cleanup;
        }
 
-       ast_register_atexit(format_list_shutdown);
+       ast_register_cleanup(format_list_shutdown);
        return 0;
 init_list_cleanup:
 
index c9704ca74bf10cdd394e626cf82e8bdaecd46816..533397be0253361baf338bd85171526c004be93f 100644 (file)
@@ -1312,7 +1312,7 @@ int ast_http_init(void)
        ast_http_uri_link(&statusuri);
        ast_http_uri_link(&staticuri);
        ast_cli_register_multiple(cli_http, ARRAY_LEN(cli_http));
-       ast_register_atexit(http_shutdown);
+       ast_register_cleanup(http_shutdown);
 
        return __ast_http_load(0);
 }
index 08620d734c1c9a24e99b3d832acfd3d01185cabc..9bd47ae1b121de869be2cce619d121f95496ee66 100644 (file)
@@ -214,6 +214,6 @@ static void image_shutdown(void)
 int ast_image_init(void)
 {
        ast_cli_register_multiple(cli_image, ARRAY_LEN(cli_image));
-       ast_register_atexit(image_shutdown);
+       ast_register_cleanup(image_shutdown);
        return 0;
 }
index 750198dc7b93b20091d7e4b6cf5558675e1c1b2e..967cae98cfd5b4842739c5cb4e3bab10d248350a 100644 (file)
@@ -1184,7 +1184,7 @@ int ast_indications_init(void)
 
        ast_cli_register_multiple(cli_indications, ARRAY_LEN(cli_indications));
 
-       ast_register_atexit(indications_shutdown);
+       ast_register_cleanup(indications_shutdown);
        return 0;
 }
 
index 7873e11a91d4eed260f759f3e318003ce308d77f..a979e3d7e3b0960de4ab1ada8afb8c2e3ba995fd 100644 (file)
@@ -7635,7 +7635,7 @@ static int __init_manager(int reload, int by_external_config)
                struct ao2_container *temp_event_docs;
 #endif
 
-               ast_register_atexit(manager_shutdown);
+               ast_register_cleanup(manager_shutdown);
 
                /* Register default actions */
                ast_manager_register_xml_core("Ping", 0, action_ping);
index bc4c0a38f0f999c455cd2ef874ca4458545bdbc3..a3a86b3808e7937ac5f501c1c8857016c5bb8535 100644 (file)
@@ -1379,7 +1379,7 @@ int ast_msg_init(void)
        res |= ast_register_application2(app_msg_send, msg_send_exec, NULL, NULL, NULL);
        res |= ast_manager_register_xml_core("MessageSend", EVENT_FLAG_MESSAGE, action_messagesend);
 
-       ast_register_atexit(message_shutdown);
+       ast_register_cleanup(message_shutdown);
 
        return res;
 }
index 9929ee12ceac1bd14de7ac9868fcbfe434634944..6f712f7cdcb1732e274343a5961e5a268eac910a 100644 (file)
@@ -567,7 +567,7 @@ int ast_named_acl_init()
 {
        ast_cli_register_multiple(cli_named_acl, ARRAY_LEN(cli_named_acl));
 
-       ast_register_atexit(named_acl_cleanup);
+       ast_register_cleanup(named_acl_cleanup);
 
        if (aco_info_init(&cfg_info)) {
                return 0;
index 783716f8e24e0f96d0da8996d35d8db8982f36a6..f2c328fbd05da277c8a485b05386a7af462fae9c 100644 (file)
@@ -12054,7 +12054,7 @@ int load_pbx(void)
 {
        int x;
 
-       ast_register_atexit(unload_pbx);
+       ast_register_cleanup(unload_pbx);
 
        /* Initialize the PBX */
        ast_verb(1, "Asterisk PBX Core Initializing\n");
@@ -12480,7 +12480,7 @@ int ast_pbx_init(void)
        hintdevices = ao2_container_alloc(HASH_EXTENHINT_SIZE, hintdevice_hash_cb, hintdevice_cmp_multiple);
        statecbs = ao2_container_alloc(1, NULL, statecbs_cmp);
 
-       ast_register_atexit(pbx_shutdown);
+       ast_register_cleanup(pbx_shutdown);
 
        return (hints && hintdevices && statecbs) ? 0 : -1;
 }
index e0a25594f63d321d95ab8ec62f33b3b667d686ea..f5bdc9ad4db482503b9b89f9c8d71278bc178301 100644 (file)
@@ -516,5 +516,5 @@ static void stun_shutdown(void)
 void ast_stun_init(void)
 {
        ast_cli_register_multiple(cli_stun, sizeof(cli_stun) / sizeof(struct ast_cli_entry));
-       ast_register_atexit(stun_shutdown);
+       ast_register_cleanup(stun_shutdown);
 }
index ad2e15c3caf672c169008f1dd36b6c6431cb27d2..60fc3229c118091fc9b1241f42280a43c8a357b0 100644 (file)
@@ -145,7 +145,7 @@ int ast_tps_init(void)
 
        ast_cli_register_multiple(taskprocessor_clis, ARRAY_LEN(taskprocessor_clis));
 
-       ast_register_atexit(tps_shutdown);
+       ast_register_cleanup(tps_shutdown);
 
        return 0;
 }
index 3770ecf70ee36effa49278a6f40653fca1774024..e1925f7f5e8f7f3ab29788cf5a0e3d5e801a158e 100644 (file)
@@ -943,7 +943,7 @@ int ast_test_init()
 #ifdef TEST_FRAMEWORK
        /* Register cli commands */
        ast_cli_register_multiple(test_cli, ARRAY_LEN(test_cli));
-       ast_register_atexit(test_shutdown);
+       ast_register_cleanup(test_shutdown);
 #endif
 
        return 0;
index 349cb4ecdf7cbd2a4509eb93177f7c780d4ec36e..4c46a0f585b6651d778c9ec0effd06c18be18cd3 100644 (file)
@@ -258,7 +258,7 @@ void threadstorage_init(void)
 {
        pthread_mutex_init(&threadstoragelock, NULL);
        ast_cli_register_multiple(cli, ARRAY_LEN(cli));
-       ast_register_atexit(threadstorage_shutdown);
+       ast_register_cleanup(threadstorage_shutdown);
 }
 
 #endif /* !defined(DEBUG_THREADLOCALS) */
index 84bff081bd44d8feeb53e5157f306cb622e17bda..335c269b1d094d088abd83c2f20de5e43c7447b2 100644 (file)
@@ -313,7 +313,7 @@ int ast_timing_init(void)
                return -1;
        }
 
-       ast_register_atexit(timing_shutdown);
+       ast_register_cleanup(timing_shutdown);
 
        return ast_cli_register_multiple(cli_timing, ARRAY_LEN(cli_timing));
 }
index c14ad019c358d0348016ccd97a2f68c938c83250..d12925709ccf9c6ddf280325a3ac6ad594bf437b 100644 (file)
@@ -1420,6 +1420,6 @@ int ast_translate_init(void)
        ast_rwlock_init(&tablelock);
        res = matrix_resize(1);
        res |= ast_cli_register_multiple(cli_translate, ARRAY_LEN(cli_translate));
-       ast_register_atexit(translate_shutdown);
+       ast_register_cleanup(translate_shutdown);
        return res;
 }
index ef74c8b5cedc587f64d483579c6dfc724334c423..b7abb17e141061e58e268d798e0706d7aeb10430 100644 (file)
@@ -1524,5 +1524,5 @@ void ast_udptl_init(void)
 
        ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl));
 
-       ast_register_atexit(udptl_shutdown);
+       ast_register_cleanup(udptl_shutdown);
 }
index dedb6740ff0e1ff9399ecf5380db966f710264be..deb6d7e6022fe51b7f9b4a814dc9bf3d8419869e 100644 (file)
@@ -2285,7 +2285,7 @@ int ast_utils_init(void)
        ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli));
 #endif
 #endif
-       ast_register_atexit(utils_shutdown);
+       ast_register_cleanup(utils_shutdown);
        return 0;
 }
 
index 4689c40f86f755699dde5e515790083a8e1c3743..fa471e9fa629f27cd2bcaa27abc66f51d3ffc275 100644 (file)
@@ -2396,7 +2396,7 @@ int ast_xmldoc_load_documentation(void)
        ast_xml_init();
 
        /* register function to be run when asterisk finish. */
-       ast_register_atexit(xmldoc_unload_documentation);
+       ast_register_cleanup(xmldoc_unload_documentation);
 
        globbuf.gl_offs = 0;    /* slots to reserve in gl_pathv */