diff --git a/.version b/.version index cf9dd256d8..34b153ef60 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.8.8.0 +1.8.8.1 diff --git a/ChangeLog b/ChangeLog index c1bb474b9d..77554e98a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2011-12-29 Asterisk Development Team + + * Asterisk 1.8.8.1 Released. + + * Handle AST_CONTROL_UPDATE_RTP_PEER frames in local bridge loop + + Failing to handle AST_CONTROL_UPDATE_RTP_PEER frames in the local bridge loop + causes the loop to exit prematurely. This causes a variety of negative side + effects, depending on when the loop exits. This patch handles the frame by + essentially swallowing the frame in the local loop, as the current channel + drivers expect the RTP bridge to handle the frame, and, in the case of the + local bridge loop, no additional action is necessary. + + (closes issue ASTERISK-19095) + Reported by: Stefan Schmidt + Tested by: Matt Jordan + + Review: https://reviewboard.asterisk.org/r/1640/ + 2011-12-15 Asterisk Development Team * Asterisk 1.8.8.0 Released. diff --git a/main/rtp_engine.c b/main/rtp_engine.c index a0dbf72e42..aa54388227 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -889,7 +889,8 @@ static enum ast_bridge_result local_bridge_loop(struct ast_channel *c0, struct a (fr->subclass.integer == AST_CONTROL_UNHOLD) || (fr->subclass.integer == AST_CONTROL_VIDUPDATE) || (fr->subclass.integer == AST_CONTROL_SRCUPDATE) || - (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS)) { + (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS) || + (fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) { /* If we are going on hold, then break callback mode and P2P bridging */ if (fr->subclass.integer == AST_CONTROL_HOLD) { if (instance0->engine->local_bridge) { @@ -910,7 +911,10 @@ static enum ast_bridge_result local_bridge_loop(struct ast_channel *c0, struct a instance0->bridged = instance1; instance1->bridged = instance0; } - ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen); + /* Since UPDATE_BRIDGE_PEER is only used by the bridging code, don't forward it */ + if (fr->subclass.integer != AST_CONTROL_UPDATE_RTP_PEER) { + ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen); + } ast_frfree(fr); } else if (fr->subclass.integer == AST_CONTROL_CONNECTED_LINE) { if (ast_channel_connected_line_macro(who, other, fr, other == c0, 1)) {