[Asterisk-code-review] app queue: Prevent crash when a call is forwarded to an inva... (asterisk[13])

Matt Jordan asteriskteam at digium.com
Thu Aug 11 11:14:59 CDT 2016


Matt Jordan has uploaded a new change for review.

  https://gerrit.asterisk.org/3466

Change subject: app_queue: Prevent crash when a call is forwarded to an invalid location
......................................................................

app_queue: Prevent crash when a call is forwarded to an invalid location

When a call forward attempt is made from a Queue member, the current
code will hang up the existing channel being forwarded prior to raising
the Stasis events informing the rest of Asterisk that the call was
forwarded. This will result in a slew of dreaded FRACKs, most likely
leading to a crash.

This patch modifies the code such that we don't hang up the original
channel until we've safely raised the Stasis messages.

ASTERISK-25797 #close

Change-Id: Ife5abed351691fd79105321636eaa8ea8dcdba38
---
M apps/app_queue.c
1 file changed, 10 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/66/3466/1

diff --git a/apps/app_queue.c b/apps/app_queue.c
index 7fd1c6c..e04942f 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -4838,6 +4838,7 @@
 					char tmpchan[256];
 					char *stuff;
 					char *tech;
+					int failed = 0;
 
 					ast_copy_string(tmpchan, ast_channel_call_forward(o->chan), sizeof(tmpchan));
 					ast_copy_string(forwarder, ast_channel_name(o->chan), sizeof(forwarder));
@@ -4950,14 +4951,20 @@
 						if (ast_call(o->chan, stuff, 0)) {
 							ast_log(LOG_NOTICE, "Forwarding failed to dial '%s/%s'\n",
 								tech, stuff);
-							do_hang(o);
-							numnochan++;
+							failed = 1;
 						}
 					}
 
-					ast_channel_publish_dial(qe->chan, o->chan, stuff, NULL);
 					ast_channel_publish_dial_forward(qe->chan, original, o->chan, NULL,
 						"CANCEL", ast_channel_call_forward(original));
+					if (o->chan) {
+						ast_channel_publish_dial(qe->chan, o->chan, stuff, NULL);
+					}
+
+					if (failed) {
+						do_hang(o);
+						numnochan++;
+					}
 
 					/* Hangup the original channel now, in case we needed it */
 					ast_hangup(winner);

-- 
To view, visit https://gerrit.asterisk.org/3466
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ife5abed351691fd79105321636eaa8ea8dcdba38
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Matt Jordan <mjordan at digium.com>



More information about the asterisk-code-review mailing list