From: Joshua Colp Date: Thu, 2 Nov 2017 10:34:46 +0000 (-0300) Subject: core: Don't attempt to write to a stream that does not exist. X-Git-Tag: 15.2.0-rc1~193^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e9b53dcd9b6e63ae15edf175c6109f1f40ea8709;p=thirdparty%2Fasterisk.git 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 --- diff --git a/main/channel.c b/main/channel.c index 7d6e5db07a..7eb40d1955 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 {