From 1e273e514d37eb758f55629d978999e951462526 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Wed, 9 Apr 2014 04:36:52 +0000 Subject: [PATCH] Avoid playback on dead channels in voicemail For years we've been generating spurious messages like: [WARNING] switch_ivr_play_say.c:348 Macro [voicemail_ack]: 'saved' did not match any patterns This would happen when the caller hangs up during the playback of certain prompts in the voicemail system where we weren't checking the return value of vm_macro_get(). Looking closely at the log, it's clear we were calling down into switch_ivr_phrase_macro() long after the channel was gone. The message above is also misleading -- switch_ivr_phrase_macro() would have been able to find that pattern just fine, but it never actually looked because the channel was gone. We'll clean up that message in a follow on commit. --- src/mod/applications/mod_voicemail/mod_voicemail.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 0d985d9c74..186c73fefb 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -1279,6 +1279,7 @@ static switch_status_t create_file(switch_core_session_t *session, vm_profile_t goto end; } else { (void) vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + if (!switch_channel_ready(channel)) goto end; } if (!strcmp(input, profile->listen_file_key)) { @@ -3673,6 +3674,7 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->urgent_key, profile->terminator_key); if (!skip_record_urgent_check) { (void) vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + if (!switch_channel_ready(channel)) goto deliver; if (*profile->urgent_key == *input) { read_flags = URGENT_FLAG_STRING; (void) switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL); @@ -3682,6 +3684,7 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p } } + deliver: if (x_user) { switch_channel_get_variables(channel, &vars); status = deliver_vm(profile, x_user, domain_name, file_path, (uint32_t)message_len, read_flags, vars,