From d0eab1d9a65046487305035fd7a81065ce4f60a7 Mon Sep 17 00:00:00 2001
From: Joshua Colp <jcolp@digium.com>
Date: Sun, 10 May 2009 17:07:46 +0000
Subject: [PATCH] Fix a bug where receiving a control frame of subclass -1
 would cause certain channels to get hung up.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@193502 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/bridging.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/main/bridging.c b/main/bridging.c
index 815623e59f..2f5afa2cbe 100644
--- a/main/bridging.c
+++ b/main/bridging.c
@@ -261,6 +261,18 @@ static struct ast_frame *bridge_handle_dtmf(struct ast_bridge *bridge, struct as
 	return frame;
 }
 
+/*! \brief Internal function used to determine whether a control frame should be dropped or not */
+static int bridge_drop_control_frame(int subclass)
+{
+	switch (subclass) {
+	case AST_CONTROL_ANSWER:
+	case -1:
+		return 1;
+	default:
+		return 0;
+	}
+}
+
 void ast_bridge_handle_trip(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_channel *chan, int outfd)
 {
 	/* If no bridge channel has been provided and the actual channel has been provided find it */
@@ -276,8 +288,8 @@ void ast_bridge_handle_trip(struct ast_bridge *bridge, struct ast_bridge_channel
 		if (!frame || (frame->frametype == AST_FRAME_CONTROL && frame->subclass == AST_CONTROL_HANGUP)) {
 			/* Signal the thread that is handling the bridged channel that it should be ended */
 			ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_END);
-		} else if (frame->frametype == AST_FRAME_CONTROL && frame->subclass == AST_CONTROL_ANSWER) {
-			ast_debug(1, "Dropping answer frame from bridge channel %p\n", bridge_channel);
+		} else if (frame->frametype == AST_FRAME_CONTROL && bridge_drop_control_frame(frame->subclass)) {
+			ast_debug(1, "Dropping control frame from bridge channel %p\n", bridge_channel);
 		} else {
 			if (frame->frametype == AST_FRAME_DTMF_BEGIN) {
 				frame = bridge_handle_dtmf(bridge, bridge_channel, frame);
-- 
GitLab