[asterisk-commits] rmudgett: branch 1.8 r320057 - in /branches/1.8/main: channel.c features.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri May 20 11:43:07 CDT 2011


Author: rmudgett
Date: Fri May 20 11:43:02 2011
New Revision: 320057

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=320057
Log:
Crash while transferring a call during DTMF feature timeout.

When a call is being attended transferred during the time between
AST_FRAME_DTMF_BEGIN and AST_FRAME_DTMF_END, the transferred channel
becomes a zombie (so tech data is not available), making ast_dtmf_stream()
segfault when it tries to send the DTMF digit (at least with SIP
channels).

Patch based on feature-end-zombie.patch uploaded by Irontec (license 1256)

* Check for zombies when ast_channel_bridge() returns.

* Guarantee that the fo parameter value is initialized in
ast_channel_bridge() before any returns.

(closes issue #19116)
Reported by: Irontec
Tested by: rmudgett

Modified:
    branches/1.8/main/channel.c
    branches/1.8/main/features.c

Modified: branches/1.8/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/channel.c?view=diff&rev=320057&r1=320056&r2=320057
==============================================================================
--- branches/1.8/main/channel.c (original)
+++ branches/1.8/main/channel.c Fri May 20 11:43:02 2011
@@ -7063,6 +7063,8 @@
 	char caller_warning = 0;
 	char callee_warning = 0;
 
+	*fo = NULL;
+
 	if (c0->_bridge) {
 		ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
 			c0->name, c0->_bridge->name);
@@ -7078,8 +7080,6 @@
 	if (ast_test_flag(c0, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
 	    ast_test_flag(c1, AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
 		return -1;
-
-	*fo = NULL;
 
 	if (ast_tvzero(config->start_time)) {
 		config->start_time = ast_tvnow();

Modified: branches/1.8/main/features.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/features.c?view=diff&rev=320057&r1=320056&r2=320057
==============================================================================
--- branches/1.8/main/features.c (original)
+++ branches/1.8/main/features.c Fri May 20 11:43:02 2011
@@ -3628,7 +3628,17 @@
 		struct ast_channel *other;	/* used later */
 	
 		res = ast_channel_bridge(chan, peer, config, &f, &who);
-		
+
+		if (ast_test_flag(chan, AST_FLAG_ZOMBIE)
+			|| ast_test_flag(peer, AST_FLAG_ZOMBIE)) {
+			/* Zombies are present time to leave! */
+			res = -1;
+			if (f) {
+				ast_frfree(f);
+			}
+			goto before_you_go;
+		}
+
 		/* When frame is not set, we are probably involved in a situation
 		   where we've timed out.
 		   When frame is set, we'll come this code twice; once for DTMF_BEGIN




More information about the asterisk-commits mailing list