From 6f0ad146d2e8dd3f96be7b3deee3383c7890f1d5 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Sat, 21 Dec 2019 01:15:57 +0400 Subject: [PATCH] [mod_sofia] Fix crash from double profile unlock on outgoing channel from a gateway on a paused profile --- src/mod/endpoints/mod_sofia/mod_sofia.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 61350bdf72..84da642aff 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -4775,6 +4775,8 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session goto error; } + profile = gateway_ptr->profile; + if (gateway_ptr->status != SOFIA_GATEWAY_UP) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Gateway \'%s\' is down!\n", gw); cause = SWITCH_CAUSE_GATEWAY_DOWN; @@ -4815,8 +4817,6 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session goto error; } - profile = gateway_ptr->profile; - if (profile && sofia_test_pflag(profile, PFLAG_STANDBY)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "System Paused\n"); cause = SWITCH_CAUSE_SYSTEM_SHUTDOWN; @@ -5180,7 +5180,8 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session goto done; error: - if (gateway_ptr) { + /* gateway pointer lock is really a readlock of the profile so we let the profile release below free that lock if we have a profile */ + if (gateway_ptr && !profile) { sofia_reg_release_gateway(gateway_ptr); }