]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_sofia] Fix crash from double profile unlock on outgoing channel from a gateway...
authorAndrey Volk <andywolk@gmail.com>
Fri, 20 Dec 2019 21:15:57 +0000 (01:15 +0400)
committerAndrey Volk <andywolk@gmail.com>
Mon, 30 Dec 2019 23:13:03 +0000 (03:13 +0400)
src/mod/endpoints/mod_sofia/mod_sofia.c

index 61350bdf7221df7998854538eeb9381515faf3a2..84da642aff60a99dd7a0a79e9d81c6cb8dfc6a12 100644 (file)
@@ -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);
        }