From 141d9f7156c165e05ad9ec03e22ba2866bf6e3ce Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Fri, 14 Oct 2005 17:02:20 +0000 Subject: Make sure when the timeout occurs that we actually break the bridge (bug #5252) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6791 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channel.c | 13 +++++++++---- channels/chan_iax2.c | 4 ++++ channels/chan_vpb.c | 4 ++++ channels/chan_zap.c | 3 ++- rtp.c | 2 ++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/channel.c b/channel.c index 61562f703..8e38d3588 100755 --- a/channel.c +++ b/channel.c @@ -2974,12 +2974,16 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct } who = ast_waitfor_n(cs, 2, &toms); if (!who) { + if (!toms) { + res = AST_BRIDGE_RETRY; + break; + } ast_log(LOG_DEBUG, "Nobody there, continuing...\n"); if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE || c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) { if (c0->_softhangup == AST_SOFTHANGUP_UNBRIDGE) - c0->_softhangup = 0; - if (c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) - c1->_softhangup = 0; + c0->_softhangup = 0; + if (c1->_softhangup == AST_SOFTHANGUP_UNBRIDGE) + c1->_softhangup = 0; c0->_bridge = c1; c1->_bridge = c0; } @@ -3215,7 +3219,8 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha ast_clear_flag(c0, AST_FLAG_NBRIDGE); ast_clear_flag(c1, AST_FLAG_NBRIDGE); } - + if (res == AST_BRIDGE_RETRY) + continue; switch (res) { case AST_BRIDGE_RETRY: /* continue; */ diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 7292e9f09..4633f80d6 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -3184,6 +3184,10 @@ static enum ast_bridge_result iax2_bridge(struct ast_channel *c0, struct ast_cha timeoutms = 0; } if (!who) { + if (!timeoutms) { + res = AST_BRIDGE_RETRY; + break; + } if (ast_check_hangup(c0) || ast_check_hangup(c1)) { res = AST_BRIDGE_FAILED; break; diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c index cebe6e2f7..93ab04e67 100755 --- a/channels/chan_vpb.c +++ b/channels/chan_vpb.c @@ -518,6 +518,10 @@ static enum ast_bridge_result vpb_bridge(struct ast_channel *c0, struct ast_chan /* Are we really ment to be doing nothing ?!?! */ who = ast_waitfor_n(cs, 2, &timeoutms); if (!who) { + if (!timeoutms) { + res = AST_BRIDGE_RETRY; + break; + } ast_log(LOG_DEBUG, "%s: vpb_bridge: Empty frame read...\n",p0->dev); /* check for hangup / whentohangup */ if (ast_check_hangup(c0) || ast_check_hangup(c1)) diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 077eba2f6..eac9c21c0 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -3139,7 +3139,8 @@ static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct ast_chann ast_mutex_unlock(&c0->lock); ast_mutex_unlock(&c1->lock); - if ((op0 != p0) || + if (!timeoutms || + (op0 != p0) || (op1 != p1) || (ofd0 != c0->fds[0]) || (ofd1 != c1->fds[0]) || diff --git a/rtp.c b/rtp.c index 468445e5f..284e99b1b 100755 --- a/rtp.c +++ b/rtp.c @@ -1677,6 +1677,8 @@ enum ast_bridge_result ast_rtp_bridge(struct ast_channel *c0, struct ast_channel } who = ast_waitfor_n(cs, 2, &timeoutms); if (!who) { + if (!timeoutms) + return AST_BRIDGE_RETRY; if (option_debug) ast_log(LOG_DEBUG, "Ooh, empty read...\n"); /* check for hangup / whentohangup */ -- cgit v1.2.3