]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix crash in ConfBridge when user announcement is played for more than 2 users
authorMatthew Jordan <mjordan@digium.com>
Thu, 24 May 2012 13:32:33 +0000 (13:32 +0000)
committerMatthew Jordan <mjordan@digium.com>
Thu, 24 May 2012 13:32:33 +0000 (13:32 +0000)
A patch introduced in r354938 made it so that ConfBridge would not attempt to
play sound files if those files did not exist.  Unfortunately, ConfBridge uses
the same underlying function, play_sound_helper, to playback both sound files
and numbers to callers.  When a number is being played back, the name of the
sound file is expected to be NULL.  This NULL value was passed into a function
that tested for the existance of a sound file and is not tolerant to NULL
file names, causing a crash.

This patch fixes the behavior, such that if a sound file does not exist we
do not attempt to play it, but we only attempt that check if the a sound file
was specified in the first place.  If a sound file was not specified, we use
the 'play number' logic in the helper function.

(closes issue ASTERISK-19899)
Reported by: Florian Gilcher
Tested by: Florian Gilcher
patches:
  asterisk-19899.diff uploaded by mjordan (license 6283)

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@367562 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_confbridge.c

index d07edf1339a6ed84fcd19708020d0e7ea94fca74..22064e3d9796c2d9fe721891e1a7b2a1c2701f06 100644 (file)
@@ -1144,8 +1144,8 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
        struct ast_channel *underlying_channel;
 
        /* Do not waste resources trying to play files that do not exist */
-       if (!ast_fileexists(filename, NULL, NULL)) {
-               ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
+       if (!ast_strlen_zero(filename) && !ast_fileexists(filename, NULL, NULL)) {
+               ast_log(LOG_WARNING, "File %s does not exist in any format\n", !ast_strlen_zero(filename) ? filename : "<unknown>");
                return 0;
        }
 
@@ -1165,7 +1165,7 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
        /* The channel is all under our control, in goes the prompt */
        if (!ast_strlen_zero(filename)) {
                ast_stream_and_wait(conference_bridge->playback_chan, filename, "");
-       } else {
+       } else if (say_number >= 0) {
                ast_say_number(conference_bridge->playback_chan, say_number, "", conference_bridge->playback_chan->language, NULL);
        }
 
@@ -1188,7 +1188,7 @@ static int play_sound_helper(struct conference_bridge *conference_bridge, const
  */
 static int play_sound_file(struct conference_bridge *conference_bridge, const char *filename)
 {
-       return play_sound_helper(conference_bridge, filename, 0);
+       return play_sound_helper(conference_bridge, filename, -1);
 }
 
 /*!