[asterisk-commits] rmudgett: branch 1.8 r311297 - /branches/1.8/channels/sig_pri.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Mar 17 21:59:09 CDT 2011
Author: rmudgett
Date: Thu Mar 17 21:59:05 2011
New Revision: 311297
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=311297
Log:
Race condition when ISDN CallRerouting/CallDeflection invoked.
The queued AST_CONTROL_BUSY could sometimes be processed before the
call_forward dial string is recognized.
* Moved setting the call_forwarding dial string after sending a response
to the initiator and just queue an empty frame to wake up the media thread
instead of an AST_CONTROL_BUSY.
* Added check for empty rerouting/deflection number and respond with an
error.
Modified:
branches/1.8/channels/sig_pri.c
Modified: branches/1.8/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_pri.c?view=diff&rev=311297&r1=311296&r2=311297
==============================================================================
--- branches/1.8/channels/sig_pri.c (original)
+++ branches/1.8/channels/sig_pri.c Thu Mar 17 21:59:05 2011
@@ -3908,16 +3908,35 @@
struct pri_party_redirecting pri_deflection;
if (!call_rsp) {
+ ast_log(LOG_WARNING,
+ "Span %d: %s tried CallRerouting/CallDeflection to '%s' without call!\n",
+ pri->span, owner->name, subcmd->u.rerouting.deflection.to.number.str);
ast_channel_unlock(owner);
+ break;
+ }
+ if (ast_strlen_zero(subcmd->u.rerouting.deflection.to.number.str)) {
ast_log(LOG_WARNING,
- "CallRerouting/CallDeflection to '%s' without call!\n",
- subcmd->u.rerouting.deflection.to.number.str);
+ "Span %d: %s tried CallRerouting/CallDeflection to empty number!\n",
+ pri->span, owner->name);
+ pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
+ PRI_REROUTING_RSP_INVALID_NUMBER);
+ ast_channel_unlock(owner);
break;
}
+ ast_verb(3, "Span %d: %s is CallRerouting/CallDeflection to '%s'.\n",
+ pri->span, owner->name, subcmd->u.rerouting.deflection.to.number.str);
+
+ /*
+ * Send back positive ACK to CallRerouting/CallDeflection.
+ *
+ * Note: This call will be hungup by the core when it processes
+ * the call_forward string.
+ */
+ pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
+ PRI_REROUTING_RSP_OK_CLEAR);
+
pri_deflection = subcmd->u.rerouting.deflection;
-
- ast_string_field_set(owner, call_forward, pri_deflection.to.number.str);
/* Adjust the deflecting to number based upon the subscription option. */
switch (subcmd->u.rerouting.subscription_option) {
@@ -3943,17 +3962,12 @@
ast_channel_set_redirecting(owner, &ast_redirecting, NULL);
ast_party_redirecting_free(&ast_redirecting);
- /*
- * Send back positive ACK to CallRerouting/CallDeflection.
- *
- * Note: This call will be hungup by the dial application when
- * it processes the call_forward string set above.
- */
- pri_rerouting_rsp(pri->pri, call_rsp, subcmd->u.rerouting.invoke_id,
- PRI_REROUTING_RSP_OK_CLEAR);
-
- /* This line is BUSY to further attempts by this dialing attempt. */
- ast_queue_control(owner, AST_CONTROL_BUSY);
+ /* Request the core to forward to the new number. */
+ ast_string_field_set(owner, call_forward,
+ subcmd->u.rerouting.deflection.to.number.str);
+
+ /* Wake up the channel. */
+ ast_queue_frame(owner, &ast_null_frame);
ast_channel_unlock(owner);
}
More information about the asterisk-commits
mailing list