From 280ffbc15522a3c9b61e16861d07b546752fe9fd Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sun, 19 Apr 2020 04:03:41 +0000 Subject: [PATCH] [core] fix possible looping recover --- src/switch_channel.c | 10 ++++++---- src/switch_core_state_machine.c | 8 +------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/switch_channel.c b/src/switch_channel.c index 5a901ec199..baca416c9e 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -2190,7 +2190,7 @@ SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch switch_core_session_wake_video_thread(channel->session); } - if (flag == CF_RECOVERING && !channel->hangup_cause) { + if (flag == CF_RECOVERING && !channel->hangup_cause && !switch_channel_test_flag(channel, CF_NO_RECOVER)) { switch_core_recovery_track(channel->session); } @@ -3931,9 +3931,11 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan switch_channel_presence(channel, "unknown", "answered", NULL); //switch_channel_audio_sync(channel); - - switch_core_recovery_track(channel->session); - + + if (!switch_channel_test_flag(channel, CF_NO_RECOVER)) { + switch_core_recovery_track(channel->session); + } + switch_channel_set_callstate(channel, CCS_ACTIVE); send_ind(channel, SWITCH_MESSAGE_ANSWER_EVENT, file, func, line); diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index 57ba3bfeb2..7a8e2e5ab7 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -55,7 +55,6 @@ static void switch_core_standard_on_init(switch_core_session_t *session) static void switch_core_standard_on_hangup(switch_core_session_t *session) { switch_caller_extension_t *extension; - int rec; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Standard HANGUP, cause: %s\n", switch_channel_get_name(session->channel), switch_channel_cause2str(switch_channel_get_cause(session->channel))); @@ -131,13 +130,8 @@ static void switch_core_standard_on_hangup(switch_core_session_t *session) } } - rec = switch_channel_test_flag(session->channel, CF_RECOVERING); switch_channel_clear_flag(session->channel, CF_RECOVERING); - - if (!rec) { - switch_core_recovery_untrack(session, SWITCH_TRUE); - } - + switch_core_recovery_untrack(session, SWITCH_TRUE); if (!switch_channel_test_flag(session->channel, CF_ZOMBIE_EXEC)) { return;