]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Avoid playback on dead channels in voicemail
authorTravis Cross <tc@traviscross.com>
Wed, 9 Apr 2014 04:36:52 +0000 (04:36 +0000)
committerTravis Cross <tc@traviscross.com>
Wed, 9 Apr 2014 05:30:26 +0000 (05:30 +0000)
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

index d488efbcdf24318b8516cea2d98515783a10b8bf..801c3bf416f35dfebde2ee0e00da147384dbafe6 100644 (file)
@@ -1278,6 +1278,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)) {
@@ -3671,6 +3672,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);
@@ -3680,6 +3682,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, message_len, read_flags, vars,