]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Pay attention to the return value of the manipulate function.
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 20 Oct 2009 22:07:11 +0000 (22:07 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 20 Oct 2009 22:07:11 +0000 (22:07 +0000)
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.4@224855 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/audiohook.c

index ec6f0f316edfb4c7ea966b4e5f97fd2b1ea1ecaa..d501e73f429e8b24af096a7047268c4a1ab7364f 100644 (file)
@@ -586,7 +586,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) {
@@ -657,11 +657,17 @@ 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)) {
+                               /* Manipulation failed */
+                               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) */
@@ -689,7 +695,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;