summaryrefslogtreecommitdiff
path: root/main/channel.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-11-02 07:34:46 -0300
committerJoshua Colp <jcolp@digium.com>2017-11-02 07:34:46 -0300
commite9b53dcd9b6e63ae15edf175c6109f1f40ea8709 (patch)
tree4ef5e97d6235a6aaab9b7b1764c7c085b34b08c4 /main/channel.c
parent21b922b565bdba9254445d1002a8a077d50ebe88 (diff)
core: Don't attempt to write to a stream that does not exist.
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
Diffstat (limited to 'main/channel.c')
-rw-r--r--main/channel.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/main/channel.c b/main/channel.c
index 7d6e5db07..7eb40d195 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -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 {