From 2eaeea690d14a2c9b8eb962a021a957abdb4444d Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 7 Apr 2016 13:05:26 -0300 Subject: res_pjsip_registrar_expire: Fix race condition at shutdown. When shutting down, the PJSIP sorcery is destroyed. The registrar expiration module queries the PJSIP sorcery to determine what to expire. As there was no synchronization between termination of the expiration thread and the unloading of the module it was possible for the thread to try to access the PJSIP sorcery after it had been destroyed. This change ensures that the thread is shut down before allowing the module to be considered unloaded. Change-Id: I69fd239edbaaf160c2d37ae00d3ac06e5596fe8b --- res/res_pjsip_registrar_expire.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'res/res_pjsip_registrar_expire.c') diff --git a/res/res_pjsip_registrar_expire.c b/res/res_pjsip_registrar_expire.c index 87edf5390..e52363e13 100644 --- a/res/res_pjsip_registrar_expire.c +++ b/res/res_pjsip_registrar_expire.c @@ -91,6 +91,7 @@ static void expiration_global_loaded(const char *object_type) } else { if (check_thread != AST_PTHREADT_NULL) { pthread_kill(check_thread, SIGURG); + pthread_join(check_thread, NULL); check_thread = AST_PTHREADT_NULL; ast_debug(3, "Interval = 0, shutting thread down\n"); } @@ -105,7 +106,10 @@ static struct ast_sorcery_observer expiration_global_observer = { static int unload_module(void) { if (check_thread != AST_PTHREADT_NULL) { + check_interval = 0; pthread_kill(check_thread, SIGURG); + pthread_join(check_thread, NULL); + check_thread = AST_PTHREADT_NULL; } -- cgit v1.2.3