]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 224856 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 20 Oct 2009 22:10:54 +0000 (22:10 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 20 Oct 2009 22:10:54 +0000 (22:10 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r224856 | tilghman | 2009-10-20 17:09:07 -0500 (Tue, 20 Oct 2009) | 12 lines

  Merged revisions 224855 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r224855 | tilghman | 2009-10-20 17:07:11 -0500 (Tue, 20 Oct 2009) | 5 lines

    Pay attention to the return value of the manipulate function.
    While this looks like an optimization, it prevents a crash from occurring
    when used with certain audiohook callbacks (diagnosed with SVN trunk,
    backported to 1.4 to keep the source consistent across versions).
  ........
................

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

main/audiohook.c

index 4df92e56df5d2282652890b5166231fb9aeddabd..ef508a7fff40447d872bb5ae6083fdd23cab1116 100644 (file)
@@ -574,7 +574,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
        struct ast_frame *start_frame = frame, *middle_frame = frame, *end_frame = frame;
        struct ast_audiohook *audiohook = NULL;
        int samples = frame->samples;
-       
+
        /* If the frame coming in is not signed linear we have to send it through the in_translate path */
        if (frame->subclass != AST_FORMAT_SLINEAR) {
                if (in_translate->format != frame->subclass) {
@@ -645,11 +645,16 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
                                continue;
                        }
                        /* Feed in frame to manipulation */
-                       audiohook->manipulate_callback(audiohook, chan, middle_frame, direction);
+                       if (audiohook->manipulate_callback(audiohook, chan, middle_frame, direction)) {
+                               ast_frfree(middle_frame);
+                               middle_frame = NULL;
+                       }
                        ast_audiohook_unlock(audiohook);
                }
                AST_LIST_TRAVERSE_SAFE_END
-               end_frame = middle_frame;
+               if (middle_frame) {
+                       end_frame = middle_frame;
+               }
        }
 
        /* Now we figure out what to do with our end frame (whether to transcode or not) */
@@ -677,7 +682,9 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
                }
        } else {
                /* No frame was modified, we can just drop our middle frame and pass the frame we got in out */
-               ast_frfree(middle_frame);
+               if (middle_frame) {
+                       ast_frfree(middle_frame);
+               }
        }
 
        return end_frame;