diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 94141d08bd..ceaac12e82 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -3624,6 +3624,11 @@ uintmax_t ast_debug_category_ice_id(void) return debug_category_ice_id; } +/*! + * \internal + * \brief Shutdown the RTP engine + * This function will not get called if any module fails to unload. + */ static void rtp_engine_shutdown(void) { int x; @@ -3648,7 +3653,15 @@ static void rtp_engine_shutdown(void) } mime_types_len = 0; ast_rwlock_unlock(&mime_types_lock); +} +/*! + * \internal + * \brief Unregister the debug categories + * This function will always get called even if any module fails to unload. + */ +static void rtp_engine_atexit(void) +{ ast_debug_category_unregister(AST_LOG_CATEGORY_ICE); ast_debug_category_unregister(AST_LOG_CATEGORY_DTLS_PACKET); @@ -3794,6 +3807,16 @@ int ast_rtp_engine_init(void) debug_category_dtls_packet_id = ast_debug_category_register(AST_LOG_CATEGORY_DTLS_PACKET); debug_category_ice_id = ast_debug_category_register(AST_LOG_CATEGORY_ICE); + /* + * Normnally a core module should call ast_register_cleanup, + * which doesn't run if any module fails to unload. This + * prevents resources being pulled out from under a running + * module and possibly causing a segfault. In this case however, + * the only thing we're cleaning up are the registrations of the + * debug categories. + */ + ast_register_atexit(rtp_engine_atexit); + return 0; } diff --git a/main/stun.c b/main/stun.c index 06e6d9ff29..3456d30821 100644 --- a/main/stun.c +++ b/main/stun.c @@ -576,8 +576,17 @@ 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_cleanup(stun_shutdown); - debug_category_stun_id = ast_debug_category_register(AST_LOG_CATEGORY_STUN); debug_category_stun_packet_id = ast_debug_category_register(AST_LOG_CATEGORY_STUN_PACKET); + + /* + * Normnally a core module should call ast_register_cleanup + * which doesn't run if any module fails to unload. This + * prevents resources being pulled out from under a running + * module and ppossibly causing a segfault. In this case however, + * the only thing we're cleaning up is the cli command and + * the registers of the debug categories. + */ + ast_register_atexit(stun_shutdown); + }