ast_bridge_channel_lock_bridge(bridge_channel);
- /* Map the frame to the bridge. */
- if (ast_channel_is_multistream(bridge_channel->chan)) {
+ /*
+ * Map the frame to the bridge.
+ * We need to lock the bridge_channel to make sure that bridge_channel->chan
+ * isn't NULL and keep it locked while we do multistream processing.
+ */
+ ast_bridge_channel_lock(bridge_channel);
+ if (bridge_channel->chan && ast_channel_is_multistream(bridge_channel->chan)) {
unmapped_stream_num = frame->stream_num;
switch (frame->frametype) {
case AST_FRAME_VOICE:
frame->stream_num = -1;
break;
}
- ast_bridge_channel_lock(bridge_channel);
if (frame->stream_num < (int)AST_VECTOR_SIZE(&bridge_channel->stream_map.to_bridge)) {
frame->stream_num = AST_VECTOR_GET(
&bridge_channel->stream_map.to_bridge, frame->stream_num);
if (0 <= frame->stream_num) {
- ast_bridge_channel_unlock(bridge_channel);
break;
}
}
unmapped_stream_num = -1;
frame->stream_num = -1;
}
+ ast_bridge_channel_unlock(bridge_channel);
deferred = bridge_channel->bridge->technology->write(bridge_channel->bridge, bridge_channel, frame);
if (deferred) {
int ast_channel_is_multistream(struct ast_channel *chan)
{
- return (chan->tech && chan->tech->read_stream && chan->tech->write_stream);
+ return (chan && chan->tech && chan->tech->read_stream && chan->tech->write_stream);
}
struct ast_channel_snapshot *ast_channel_snapshot(const struct ast_channel *chan)