core: Don't attempt to write to a stream that does not exist.
authorJoshua Colp <jcolp@digium.com>
Thu, 2 Nov 2017 10:34:46 +0000 (07:34 -0300)
committerJoshua Colp <jcolp@digium.com>
Thu, 2 Nov 2017 10:37:48 +0000 (05:37 -0500)
When a frame is provided to ast_write ensure that a multistream
capable channel has a stream for it before attempting to give it
to the channel driver. In some cases (such as a deferred SDP
negotiation) the stream may not yet exist.

ASTERISK-27364

Change-Id: Icf84ca982a67cdd6e9a71851eb7eb1bd0e865276

main/channel.c

index 7d6e5db..7eb40d1 100644 (file)
@@ -5054,7 +5054,11 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
        case AST_FRAME_VIDEO:
                /* XXX Handle translation of video codecs one day XXX */
                if (ast_channel_tech(chan)->write_stream) {
-                       res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
+                       if (stream) {
+                               res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
+                       } else {
+                               res = 0;
+                       }
                } else if ((stream == default_stream) && ast_channel_tech(chan)->write_video) {
                        res = ast_channel_tech(chan)->write_video(chan, fr);
                } else {
@@ -5063,7 +5067,11 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
                break;
        case AST_FRAME_MODEM:
                if (ast_channel_tech(chan)->write_stream) {
-                       res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
+                       if (stream) {
+                               res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), fr);
+                       } else {
+                               res = 0;
+                       }
                } else if ((stream == default_stream) && ast_channel_tech(chan)->write) {
                        res = ast_channel_tech(chan)->write(chan, fr);
                } else {
@@ -5251,7 +5259,11 @@ int ast_write_stream(struct ast_channel *chan, int stream_num, struct ast_frame
                        f = NULL;
                } else {
                        if (ast_channel_tech(chan)->write_stream) {
-                               res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), f);
+                               if (stream) {
+                                       res = ast_channel_tech(chan)->write_stream(chan, ast_stream_get_position(stream), f);
+                               } else {
+                                       res = 0;
+                               }
                        } else if ((stream == default_stream) && ast_channel_tech(chan)->write) {
                                res = ast_channel_tech(chan)->write(chan, f);
                        } else {