[asterisk-commits] mjordan: branch 1.8 r387036 - /branches/1.8/main/features.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Apr 30 17:34:08 CDT 2013
Author: mjordan
Date: Tue Apr 30 17:34:05 2013
New Revision: 387036
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=387036
Log:
Fix CDR not being created during an externally initiated blind transfer
Way back when in the dark days of Asterisk 1.8.9, blind transferring a call
in a context that included the 'h' extension would inadvertently execute the
hangup code logic on the transferred channel. This was a "bad thing". The fix
was to properly check for the softhangup flags on the channel and only execute
the 'h' extension logic (and, in later versions, hangup handler logic) if the
channel was well and truly dead (Jim).
Unfortunately, CDRs are fickle. Setting the softhangup flag when we detected
that the channel was leaving the bridge (but not to die) caused some crucial
snippet of CDR code, lying in ambush in the middle of the bridging code, to
not get executed. This had the effect of blowing away one of the CDRs that is
typically created during a blind transfer.
While we live and die by the adage "don't touch CDRs in release branches", this
was our bad. The attached patch restores the CDR behavior, and still manages to
not run the 'h' extension during a blind transfer (at least not when it's
supposed to).
Thanks to Steve Davies for diagnosing this and providing a fix.
Review: https://reviewboard.asterisk.org/r/2476
(closes issue ASTERISK-21394)
Reported by: Ishfaq Malik
Tested by: Ishfaq Malik, mjordan
patches:
fix_missing_blindXfer_cdr2 uploaded by one47 (License 5012)
Modified:
branches/1.8/main/features.c
Modified: branches/1.8/main/features.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/features.c?view=diff&rev=387036&r1=387035&r2=387036
==============================================================================
--- branches/1.8/main/features.c (original)
+++ branches/1.8/main/features.c Tue Apr 30 17:34:05 2013
@@ -4208,17 +4208,6 @@
if (!f || (f->frametype == AST_FRAME_CONTROL &&
(f->subclass.integer == AST_CONTROL_HANGUP || f->subclass.integer == AST_CONTROL_BUSY ||
f->subclass.integer == AST_CONTROL_CONGESTION))) {
- /*
- * If the bridge was broken for a hangup that isn't real,
- * then don't run the h extension, because the channel isn't
- * really hung up. This should really only happen with AST_SOFTHANGUP_ASYNCGOTO,
- * but it doesn't hurt to check AST_SOFTHANGUP_UNBRIDGE either.
- */
- ast_channel_lock(chan);
- if (chan->_softhangup & (AST_SOFTHANGUP_ASYNCGOTO | AST_SOFTHANGUP_UNBRIDGE)) {
- ast_set_flag(chan, AST_FLAG_BRIDGE_HANGUP_DONT);
- }
- ast_channel_unlock(chan);
res = -1;
break;
}
@@ -4404,9 +4393,17 @@
/* run the hangup exten on the chan object IFF it was NOT involved in a parking situation
* if it were, then chan belongs to a different thread now, and might have been hung up long
- * ago.
+ * ago.
*/
- if (ast_test_flag(&config->features_caller, AST_FEATURE_NO_H_EXTEN)) {
+ if (chan->_softhangup & (AST_SOFTHANGUP_ASYNCGOTO | AST_SOFTHANGUP_UNBRIDGE)) {
+ /*
+ * If the bridge was broken for a hangup that isn't real,
+ * then don't run the h extension, because the channel isn't
+ * really hung up. This should really only happen with AST_SOFTHANGUP_ASYNCGOTO,
+ * but it doesn't hurt to check AST_SOFTHANGUP_UNBRIDGE either.
+ */
+ h_context = NULL;
+ } else if (ast_test_flag(&config->features_caller, AST_FEATURE_NO_H_EXTEN)) {
h_context = NULL;
} else if (ast_exists_extension(chan, chan->context, "h", 1,
S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
More information about the asterisk-commits
mailing list