]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix race in sla
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 15 Apr 2011 19:22:45 +0000 (14:22 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Fri, 15 Apr 2011 19:22:53 +0000 (14:22 -0500)
src/mod/endpoints/mod_sofia/sofia.c
src/switch_channel.c
src/switch_ivr_bridge.c

index cf25aae369a00eacd8c5d752d35fbf7d78f5835f..9061270a918c7d21b9889605edf2e12c1a3b7dc0 100644 (file)
@@ -7150,7 +7150,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
                                const char *data = switch_channel_get_variable(b_channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE);
 
                                if (app && data && !strcasecmp(app, "conference")) {
-                                       destination_number = switch_core_session_sprintf(b_session, "answer,conference:%s", data);
+                                       destination_number = switch_core_session_sprintf(session, "answer,conference:%s", data);
                                        dialplan = "inline";
                                } else {
                                        if (switch_core_session_check_interface(b_session, sofia_endpoint_interface)) {
@@ -7188,7 +7188,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
                                                        if (!one_leg &&
                                                                (!b_tech_pvt || !sofia_test_flag(b_tech_pvt, TFLAG_SIP_HOLD)) &&
                                                                (!c_tech_pvt || !sofia_test_flag(c_tech_pvt, TFLAG_SIP_HOLD))) {
-                                                               char *ext = switch_core_session_sprintf(b_session, "answer,conference:%s@sla+flags{mintwo}", uuid);
+                                                               char *ext = switch_core_session_sprintf(session, "answer,conference:%s@sla+flags{mintwo}", uuid);
 
                                                                switch_channel_set_flag(c_channel, CF_REDIRECT);
                                                                switch_ivr_session_transfer(b_session, ext, "inline", NULL);
@@ -7200,16 +7200,17 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_
                                                }
 
                                                if (do_conf) {
-                                                       destination_number = switch_core_session_sprintf(b_session, "answer,conference:%s@sla+flags{mintwo}", uuid);
+                                                       destination_number = switch_core_session_sprintf(session, "answer,conference:%s@sla+flags{mintwo}", uuid);
                                                } else {
                                                        if (one_leg && c_app) {
                                                                if (c_data) {
-                                                                       destination_number = switch_core_session_sprintf(b_session, "answer,%s:%s", c_app, c_data);
+                                                                       destination_number = switch_core_session_sprintf(session, "answer,%s:%s", c_app, c_data);
                                                                } else {
-                                                                       destination_number = switch_core_session_sprintf(b_session, "answer,%s", c_app);
+                                                                       destination_number = switch_core_session_sprintf(session, "answer,%s", c_app);
                                                                }
                                                        } else {
-                                                               destination_number = switch_core_session_sprintf(b_session, "answer,intercept:%s", uuid);
+                                                               switch_channel_mark_hold(b_channel, SWITCH_FALSE);
+                                                               destination_number = switch_core_session_sprintf(session, "answer,intercept:%s", uuid);
                                                        }
                                                }
 
index bc8daabbc6543207fd0c616f35cd94d08c7cb80d..2a53c34e9361f4885c6407ef2acd7fac2f5c9518 100644 (file)
@@ -634,6 +634,10 @@ SWITCH_DECLARE(void) switch_channel_mark_hold(switch_channel_t *channel, switch_
 {
        switch_event_t *event;
 
+       if (!!on == !!switch_channel_test_flag(channel, CF_LEG_HOLDING)) {
+               return;
+       }
+       
        if (on) {
                switch_channel_set_flag(channel, CF_LEG_HOLDING);
        } else {
index f1a6bdba22a7f9a0990b1822f5b39d81aec919f8..d10b5e0e5e1c0f1a33a828d45d53f84fcf99cce2 100644 (file)
@@ -1576,6 +1576,8 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session
                switch_channel_answer(rchannel);
        }
 
+       switch_channel_mark_hold(rchannel, SWITCH_FALSE);
+
        switch_channel_set_state_flag(rchannel, CF_TRANSFER);
        switch_channel_set_state(rchannel, CS_PARK);