[Home]

Summary:ASTERISK-13488: Revision 172517 segfault after using A *2 transfer to B and B dial *2
Reporter:David Brillert (aragon)Labels:
Date Opened:2009-01-30 13:40:52.000-0600Date Closed:2009-02-05 12:42:13.000-0600
Priority:CriticalRegression?No
Status:Closed/CompleteComponents:Applications/app_transfer
Versions:Frequency of
Occurrence
Related
Issues:
Environment:Attachments:( 0) 14374.patch
( 1) parking_fix_fix.diff.txt
Description:SIP environment
Extension 6011 dials 6010
6010 dials *26002 and ends call to complete transfer
6002 answers and dials *2 but does receive audio for transfer prompt
Asterisk segfaults after dialing *2

Backtrace attached

****** ADDITIONAL INFORMATION ******

CLI info (sorry about the AGI scripts and stuff)

 -- Executing [6010@default-super:1] GotoIf("SIP/6011-b7be7098", "0?3") in new stack
   -- Executing [6010@default-super:2] Set("SIP/6011-b7be7098", "GROUP(OUTGOING)=6011") in new stack
   -- Executing [6010@default-super:3] Set("SIP/6011-b7be7098", "OUTBOUND_GROUP_ONCE=6010@INCOMING") in new stack
   -- Executing [6010@default-super:4] Set("SIP/6011-b7be7098", "GROUPCOUNT=0") in new stack
   -- Executing [6010@default-super:5] Set("SIP/6011-b7be7098", "GROUPCOUNT2=0") in new stack
   -- Executing [6010@default-super:6] Set("SIP/6011-b7be7098", "DB(default/wrapup/6010/lastcall)=1233343951.37") in new stack
   -- Executing [6010@default-super:7] Macro("SIP/6011-b7be7098", "default-dial|SIP/6010|6010|default|20|en|b6010@default|tkKM(all-tapi^1233343951.37)||default||Local/0@default-local/n|vm") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("SIP/6011-b7be7098", ""CALL TO LOCAL EXTENSION FROM 6011(6011)"") in new stack
   -- Executing [s@macro-default-dial:2] UserEvent("SIP/6011-b7be7098", "TAPI|TAPIEVENT: LINE_NEWCALL default") in new stack
   -- Executing [s@macro-default-dial:3] UserEvent("SIP/6011-b7be7098", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_OFFERING") in new stack
   -- Executing [s@macro-default-dial:4] UserEvent("SIP/6011-b7be7098", "TAPI|TAPIEVENT: SET CALLERID ") in new stack
   -- Executing [s@macro-default-dial:5] UserEvent("SIP/6011-b7be7098", "TAPI|TAPIEVENT: LINE_CALLINFO LINECALLINFOSTATE_CALLERID") in new stack
   -- Executing [s@macro-default-dial:6] AGI("SIP/6011-b7be7098", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6010' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
   -- AGI Script Executing Application: (MixMonitor) Options: (6010:_1233343951.37.WAV|b)
 == Begin MixMonitor Recording SIP/6011-b7be7098
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6010' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6011'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6010/CallTrace to 6011
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6010|20|tkKM(all-tapi^1233343951.37)T|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6010|20|tkKM(all-tapi^1233343951.37)T|)
   -- Called 6010
   -- SIP/6010-095f4e30 is ringing
   -- SIP/6010-095f4e30 answered SIP/6011-b7be7098
   -- Executing [s@macro-all-tapi:1] UserEvent("SIP/6010-095f4e30", "TAPI|TAPIEVENT [~1233343951.37] LINE_CALLSTATE LINECALLSTATE_CONNECTED") in new stack
   -- Started music on hold, class 'default', on SIP/6011-b7be7098
   -- <SIP/6010-095f4e30> Playing 'pbx-transfer' (language 'en')
   -- Executing [6002@default-super:1] GotoIf("Local/6002@default-super-3c51,2", "0?3") in new stack
   -- Executing [6002@default-super:2] Set("Local/6002@default-super-3c51,2", "GROUP(OUTGOING)=6010") in new stack
   -- Executing [6002@default-super:3] Set("Local/6002@default-super-3c51,2", "OUTBOUND_GROUP_ONCE=6002@INCOMING") in new stack
   -- Executing [6002@default-super:4] Set("Local/6002@default-super-3c51,2", "GROUPCOUNT=0") in new stack
   -- Executing [6002@default-super:5] Set("Local/6002@default-super-3c51,2", "GROUPCOUNT2=0") in new stack
   -- Executing [6002@default-super:6] Set("Local/6002@default-super-3c51,2", "DB(default/wrapup/6002/lastcall)=1233343957.40") in new stack
   -- Executing [6002@default-super:7] Macro("Local/6002@default-super-3c51,2", "default-dial|SIP/6002|6002|default|20|en|b6002@default|tkKM(all-tapi^1233343957.40)||default||Local/0@default-local/n|Local/s@default-aa-servicemainmenubutton1englishsubmenu") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("Local/6002@default-super-3c51,2", ""CALL TO LOCAL EXTENSION FROM 6010()"") in new stack
   -- Executing [s@macro-default-dial:2] UserEvent("Local/6002@default-super-3c51,2", "TAPI|TAPIEVENT: LINE_NEWCALL default") in new stack
   -- Executing [s@macro-default-dial:3] UserEvent("Local/6002@default-super-3c51,2", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_OFFERING") in new stack
   -- Executing [s@macro-default-dial:4] UserEvent("Local/6002@default-super-3c51,2", "TAPI|TAPIEVENT: SET CALLERID ") in new stack
   -- Executing [s@macro-default-dial:5] UserEvent("Local/6002@default-super-3c51,2", "TAPI|TAPIEVENT: LINE_CALLINFO LINECALLINFOSTATE_CALLERID") in new stack
   -- Executing [s@macro-default-dial:6] AGI("Local/6002@default-super-3c51,2", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6002' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
   -- AGI Script Executing Application: (MixMonitor) Options: (6002:_1233343957.40.WAV|b)
 == Begin MixMonitor Recording Local/6002@default-super-3c51,2
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6002' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6010'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6002/CallTrace to 6010
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6002|20|tkKM(all-tapi^1233343957.40)T|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6002|20|tkKM(all-tapi^1233343957.40)T|)
Extension Changed 6002[default-local] new state Ringing for Notify User 6001
   -- Called 6002
   -- SIP/6002-b7bdaf28 is ringing
   -- Local/6002@default-super-3c51,1 is ringing
   -- Stopped music on hold on SIP/6011-b7be7098
   -- <Local/6002@default-super-3c51,1> Playing 'beep' (language 'en')
   -- Executing [h@macro-default-dial:1] ResetCDR("Transfered/SIP/6011-b7be7098<ZOMBIE>", "w") in new stack
   -- Local/6002@default-super-3c51,2 requested special control 20, passing it to SIP/6002-b7bdaf28
   -- Executing [h@macro-default-dial:2] NoCDR("Transfered/SIP/6011-b7be7098<ZOMBIE>", "") in new stack
   -- Executing [h@macro-default-dial:3] UserEvent("Transfered/SIP/6011-b7be7098<ZOMBIE>", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_IDLE") in new stack
   -- Executing [h@macro-default-dial:4] System("Transfered/SIP/6011-b7be7098<ZOMBIE>", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233343951.37") in new stack
Extension Changed 6002[default-local] new state InUse for Notify User 6001
   -- SIP/6002-b7bdaf28 answered Local/6002@default-super-3c51,2
   -- Executing [s@macro-all-tapi:1] UserEvent("SIP/6002-b7bdaf28", "TAPI|TAPIEVENT [~1233343957.40] LINE_CALLSTATE LINECALLSTATE_CONNECTED") in new stack
   -- Executing [h@macro-default-dial:1] ResetCDR("Local/6002@default-super-3c51,2", "w") in new stack
   -- Executing [h@macro-default-dial:2] NoCDR("Local/6002@default-super-3c51,2", "") in new stack
   -- Executing [h@macro-default-dial:3] UserEvent("Local/6002@default-super-3c51,2", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_IDLE") in new stack
   -- Executing [h@macro-default-dial:4] System("Local/6002@default-super-3c51,2", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233343957.40") in new stack
Extension Changed 6010[default-local] new state Idle for Notify User 6001
   -- AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php completed, returning 0
 == End MixMonitor Recording SIP/6011-b7be7098
 == Spawn extension (macro-default-dial, s, 6) exited non-zero on 'Local/6002@default-super-3c51,2' in macro 'default-dial'
 == Spawn extension (default-super, 6002, 7) exited non-zero on 'Local/6002@default-super-3c51,2'
lab*CLI>
Disconnected from Asterisk server
Comments:By: David Brillert (aragon) 2009-01-30 13:41:48.000-0600

Looks like I did not set category correctly.
Backtrace shows crash in mixmonitor

(gdb) bt
#0  0x080936cb in ast_bridged_channel ()
#1  0x0694f4da in mixmonitor_thread (obj=0x958d6f8) at app_mixmonitor.c:169
#2  0x0811fd2b in dummy_start ()
#3  0x008fd45b in start_thread () from /lib/libpthread.so.0
#4  0x00854e5e in clone () from /lib/libc.so.6
(gdb) bt full
#0  0x080936cb in ast_bridged_channel ()
No symbol table info available.
#1  0x0694f4da in mixmonitor_thread (obj=0x958d6f8) at app_mixmonitor.c:169
       fr = (struct ast_frame *) 0x95862f0
       mixmonitor = (struct mixmonitor *) 0x958d6f8
       fs = (struct ast_filestream *) 0x95f4880
       oflags = 577
       ext = 0x958ecd4 "WAV"
       errflag = 0
       __PRETTY_FUNCTION__ = "mixmonitor_thread"
#2  0x0811fd2b in dummy_start ()
No symbol table info available.
#3  0x008fd45b in start_thread () from /lib/libpthread.so.0
No symbol table info available.
#4  0x00854e5e in clone () from /lib/libc.so.6
No symbol table info available.

By: David Brillert (aragon) 2009-01-30 13:53:22.000-0600

I disabled mixmonitor on all the extensions and no crash
But the second *2 (from ext 6002) attempt is ignored by Asterisk (again sorry for AGI scripts and stuff)

New CLI without mixmonitor in dialplan:

   -- Executing [6010@default-super:1] GotoIf("SIP/6011-b7bde2b8", "0?3") in new stack
   -- Executing [6010@default-super:2] Set("SIP/6011-b7bde2b8", "GROUP(OUTGOING)=6011") in new stack
   -- Executing [6010@default-super:3] Set("SIP/6011-b7bde2b8", "OUTBOUND_GROUP_ONCE=6010@INCOMING") in new stack
   -- Executing [6010@default-super:4] Set("SIP/6011-b7bde2b8", "GROUPCOUNT=0") in new stack
   -- Executing [6010@default-super:5] Set("SIP/6011-b7bde2b8", "GROUPCOUNT2=0") in new stack
   -- Executing [6010@default-super:6] Set("SIP/6011-b7bde2b8", "DB(default/wrapup/6010/lastcall)=1233345150.8") in new stack
   -- Executing [6010@default-super:7] Macro("SIP/6011-b7bde2b8", "default-dial|SIP/6010|6010|default|20|en|b6010@default|tkKM(all-tapi^1233345150.8)||default||Local/0@default-local/n|vm") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("SIP/6011-b7bde2b8", ""CALL TO LOCAL EXTENSION FROM 6011(6011)"") in new stack
   -- Executing [s@macro-default-dial:2] UserEvent("SIP/6011-b7bde2b8", "TAPI|TAPIEVENT: LINE_NEWCALL default") in new stack
   -- Executing [s@macro-default-dial:3] UserEvent("SIP/6011-b7bde2b8", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_OFFERING") in new stack
   -- Executing [s@macro-default-dial:4] UserEvent("SIP/6011-b7bde2b8", "TAPI|TAPIEVENT: SET CALLERID ") in new stack
   -- Executing [s@macro-default-dial:5] UserEvent("SIP/6011-b7bde2b8", "TAPI|TAPIEVENT: LINE_CALLINFO LINECALLINFOSTATE_CALLERID") in new stack
   -- Executing [s@macro-default-dial:6] AGI("SIP/6011-b7bde2b8", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6010' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6010' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6011'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6010/CallTrace to 6011
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6010|20|tkKM(all-tapi^1233345150.8)T|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6010|20|tkKM(all-tapi^1233345150.8)T|)
   -- Called 6010
   -- SIP/6010-0899db28 is ringing
   -- SIP/6010-0899db28 answered SIP/6011-b7bde2b8
   -- Executing [s@macro-all-tapi:1] UserEvent("SIP/6010-0899db28", "TAPI|TAPIEVENT [~1233345150.8] LINE_CALLSTATE LINECALLSTATE_CONNECTED") in new stack
   -- Started music on hold, class 'default', on SIP/6011-b7bde2b8
   -- <SIP/6010-0899db28> Playing 'pbx-transfer' (language 'en')
   -- Executing [6002@default-super:1] GotoIf("Local/6002@default-super-1498,2", "0?3") in new stack
   -- Executing [6002@default-super:2] Set("Local/6002@default-super-1498,2", "GROUP(OUTGOING)=6010") in new stack
   -- Executing [6002@default-super:3] Set("Local/6002@default-super-1498,2", "OUTBOUND_GROUP_ONCE=6002@INCOMING") in new stack
   -- Executing [6002@default-super:4] Set("Local/6002@default-super-1498,2", "GROUPCOUNT=0") in new stack
   -- Executing [6002@default-super:5] Set("Local/6002@default-super-1498,2", "GROUPCOUNT2=0") in new stack
   -- Executing [6002@default-super:6] Set("Local/6002@default-super-1498,2", "DB(default/wrapup/6002/lastcall)=1233345156.11") in new stack
   -- Executing [6002@default-super:7] Macro("Local/6002@default-super-1498,2", "default-dial|SIP/6002|6002|default|20|en|b6002@default|tkKM(all-tapi^1233345156.11)||default||Local/0@default-local/n|Local/s@default-aa-servicemainmenubutton1englishsubmenu") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("Local/6002@default-super-1498,2", ""CALL TO LOCAL EXTENSION FROM 6010()"") in new stack
   -- Executing [s@macro-default-dial:2] UserEvent("Local/6002@default-super-1498,2", "TAPI|TAPIEVENT: LINE_NEWCALL default") in new stack
   -- Executing [s@macro-default-dial:3] UserEvent("Local/6002@default-super-1498,2", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_OFFERING") in new stack
   -- Executing [s@macro-default-dial:4] UserEvent("Local/6002@default-super-1498,2", "TAPI|TAPIEVENT: SET CALLERID ") in new stack
   -- Executing [s@macro-default-dial:5] UserEvent("Local/6002@default-super-1498,2", "TAPI|TAPIEVENT: LINE_CALLINFO LINECALLINFOSTATE_CALLERID") in new stack
   -- Executing [s@macro-default-dial:6] AGI("Local/6002@default-super-1498,2", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6002' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6002' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6010'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6002/CallTrace to 6010
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6002|20|tkKM(all-tapi^1233345156.11)T|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6002|20|tkKM(all-tapi^1233345156.11)T|)
   -- Called 6002
   -- SIP/6002-089c5980 is ringing
   -- Local/6002@default-super-1498,1 is ringing
   -- Stopped music on hold on SIP/6011-b7bde2b8
   -- <Local/6002@default-super-1498,1> Playing 'beep' (language 'en')
   -- Executing [h@macro-default-dial:1] ResetCDR("Transfered/SIP/6011-b7bde2b8<ZOMBIE>", "w") in new stack
   -- Executing [h@macro-default-dial:2] NoCDR("Transfered/SIP/6011-b7bde2b8<ZOMBIE>", "") in new stack
   -- Executing [h@macro-default-dial:3] UserEvent("Transfered/SIP/6011-b7bde2b8<ZOMBIE>", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_IDLE") in new stack
   -- Executing [h@macro-default-dial:4] System("Transfered/SIP/6011-b7bde2b8<ZOMBIE>", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233345150.8") in new stack
   -- Local/6002@default-super-1498,2 requested special control 20, passing it to SIP/6002-089c5980
 == Spawn extension (macro-default-dial, s, 6) exited non-zero on 'Transfered/SIP/6011-b7bde2b8<ZOMBIE>' in macro 'default-dial'
 == Spawn extension (default-super, 6010, 7) exited non-zero on 'Transfered/SIP/6011-b7bde2b8<ZOMBIE>'
   -- SIP/6002-089c5980 answered Local/6002@default-super-1498,2
   -- Executing [s@macro-all-tapi:1] UserEvent("SIP/6002-089c5980", "TAPI|TAPIEVENT [~1233345156.11] LINE_CALLSTATE LINECALLSTATE_CONNECTED") in new stack
   -- Executing [h@macro-default-dial:1] ResetCDR("Local/6002@default-super-1498,2", "w") in new stack
   -- Executing [h@macro-default-dial:2] NoCDR("Local/6002@default-super-1498,2", "") in new stack
   -- Executing [h@macro-default-dial:3] UserEvent("Local/6002@default-super-1498,2", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_IDLE") in new stack
   -- Executing [h@macro-default-dial:4] System("Local/6002@default-super-1498,2", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233345156.11") in new stack
 == Spawn extension (macro-default-dial, s, 6) exited non-zero on 'Local/6002@default-super-1498,2' in macro 'default-dial'
 == Spawn extension (default-super, 6002, 7) exited non-zero on 'Local/6002@default-super-1498,2'
   -- Executing [h@macro-default-dial:1] ResetCDR("SIP/6011-b7bde2b8", "w") in new stack
   -- Executing [h@macro-default-dial:2] NoCDR("SIP/6011-b7bde2b8", "") in new stack
   -- Executing [h@macro-default-dial:3] UserEvent("SIP/6011-b7bde2b8", "TAPI|TAPIEVENT: LINE_CALLSTATE LINECALLSTATE_IDLE") in new stack
   -- Executing [h@macro-default-dial:4] System("SIP/6011-b7bde2b8", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233345157.13") in new stack
Extension Changed 6002[default-local] new state Idle for Notify User 6010
Extension Changed 6011[default-local] new state Idle for Notify User 6010

By: David Brillert (aragon) 2009-01-30 19:08:08.000-0600

I think this is actually two bugs.

*2 cannot be re-used
A calls B and B*2 to C and C tries to *2 somewhere else (not permitted)

A calls B and B*2 to C and C tries to *2 somewhere else (segfault when mixmonitor is in dial plan)

Fixing the first problem would probably fix the segfault.

By: Terry Wilson (twilson) 2009-02-02 09:35:07.000-0600

Ok, I found the bug I introduced after fixing some issues that were posted on reviewboard.  Try parking_fix_fix.diff.txt.

By: Terry Wilson (twilson) 2009-02-02 10:46:30.000-0600

Oh, and for future reference (although I hope this is the end of them!), app_transfer is not where this would go as you are not using the dialplan app Transfer(), it would be in resources/res_features.

By: David Brillert (aragon) 2009-02-02 11:50:29.000-0600

This time the *2 transfers can be re-used but segfault occurs after A hangs up
A>B B*2>C C*2>D segfaults after A hangup

(gdb) bt
#0  0x080936cb in ast_bridged_channel ()
#1  0x00d204da in mixmonitor_thread (obj=0x9cc0cc8) at app_mixmonitor.c:169
#2  0x0811fd2b in dummy_start ()
#3  0x008fd45b in start_thread () from /lib/libpthread.so.0
#4  0x00854e5e in clone () from /lib/libc.so.6
(gdb) bt full
#0  0x080936cb in ast_bridged_channel ()
No symbol table info available.
#1  0x00d204da in mixmonitor_thread (obj=0x9cc0cc8) at app_mixmonitor.c:169
       fr = (struct ast_frame *) 0x9cca380
       mixmonitor = (struct mixmonitor *) 0x9cc0cc8
       fs = (struct ast_filestream *) 0x9ccf790
       oflags = 577
       ext = 0x9cc22a3 "WAV"
       errflag = 0
       __PRETTY_FUNCTION__ = "mixmonitor_thread"
#2  0x0811fd2b in dummy_start ()
No symbol table info available.
#3  0x008fd45b in start_thread () from /lib/libpthread.so.0
No symbol table info available.
#4  0x00854e5e in clone () from /lib/libc.so.6
No symbol table info available.

By: Terry Wilson (twilson) 2009-02-02 11:53:24.000-0600

Ah, I forgot about the mixmonitor stuff.  I will add that to my dialplan and see what happens.

By: Terry Wilson (twilson) 2009-02-02 13:25:24.000-0600

I see the issue, since there is a masquerade happening with the transfer, it looks like the channel is hung up and is freed.  Unfortunately, mixmonitor_thread() doesn't know that the channel has disappeared and tries to access it.  The good news is that my fix really doesn't have anything to do with it (other than letting things get far enough in the process to expose the bug), the bad news it doesn't look particularly easy to fix.

By: Mark Michelson (mmichelson) 2009-02-03 10:48:50.000-0600

I've swiped this issue from otherwiseguy since he is quite busy with some other projects. I understand why this crash is occurring, but like otherwise guy said, the fix isn't necessarily easy. I'll come up with something, though.

By: David Brillert (aragon) 2009-02-03 10:57:11.000-0600

:D

By: Mark Michelson (mmichelson) 2009-02-04 11:06:52.000-0600

I've started a branch to fix this issue. It may be checked out from

http://svn.digium.com/svn/asterisk/team/mmichelson/chan_fixup

In it, I have already corrected the mixmonitor issue reported here. I now am attempting to do some similar cleanup in app_chanspy. The branch is based off the current tip of the Asterisk 1.4 branch. I expect that once I have completed my work in the branch, I will post a review request on reviewboard. I will provide a link to that once I have made the review request.

By: Mark Michelson (mmichelson) 2009-02-04 16:30:15.000-0600

After discussing this a bit with others, I'm taking a different approach. For 1.4, I am going to just patch app_mixmonitor locally instead of introducing a new API like I was doing in the branch I linked to above. That work will eventually be applied to trunk after it has gone through the review process.

By: Mark Michelson (mmichelson) 2009-02-04 17:58:40.000-0600

14374.patch fixed the problem for me locally. Please test and let me know if it works for you, too. Thanks!

By: David Brillert (aragon) 2009-02-04 20:19:39.000-0600

Thanks

I'll test as soon as I can and report.

By: David Brillert (aragon) 2009-02-05 08:33:08.000-0600

putnopvut your patch fixes the segfaults related to re-using *2 during transfers.
I also decided to test all of the other transfer scenarios after installing both patches from this bug report.

Technically speaking this bug report could be closed because the patch fixes the reported problem.

However, *1 transfers cannot be re-used in the same scenario as reported for *2 transfers when I opened the bug report, but with different symptoms. I reverted your patch to test *1 transfers and SIP blind transfers and these problems were not introduced as a result of your patch. I reverted otherwiseguy's patch too and his work did not introduce this issue either. I tested *1 transfers earlier without these strange results so I can only assume that this new issue is also related to mixmonitor in the dial plan when using blind transfers.
I also get the same exact results if I use Polycom blind SIP transfers instead of *1 transfers. So the new issue is common to *1 and SIP blind transfers.

I think it might be best to fix the *1 issues on this bug report and I'll continue to test with your *2 segfault patch and otherwiseguy's patch to fix the *2 transfer problems. If you would prefer to have me open another bug report so you can close this one out then that is OK too...

Here is a summary of the *1 transfer problem.

Symptoms:

A>B B*1>C C*1>D does not transfer C to D as expected, instead it transfers A back to B

6011>6005 6005*1>6010 6010*1>6002 =result 6011 transferred to 6005

CLI

   -- Executing [6005@default-super:1] GotoIf("SIP/6011-088ce498", "0?3") in new stack
   -- Executing [6005@default-super:2] Set("SIP/6011-088ce498", "GROUP(OUTGOING)=6011") in new stack
   -- Executing [6005@default-super:3] Set("SIP/6011-088ce498", "OUTBOUND_GROUP_ONCE=6005@INCOMING") in new stack
   -- Executing [6005@default-super:4] Set("SIP/6011-088ce498", "DB(default/wrapup/6005/lastcall)=1233842796.33") in new stack
   -- Executing [6005@default-super:5] Macro("SIP/6011-088ce498", "default-dial|SIP/6005|6005|default|20|en|b6005@default|tkK||default||Local/0@default-local/n|vm") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("SIP/6011-088ce498", ""CALL TO LOCAL EXTENSION FROM 6011(6011)"") in new stack
   -- Executing [s@macro-default-dial:2] AGI("SIP/6011-088ce498", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6005' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
   -- AGI Script Executing Application: (MixMonitor) Options: (6011:_1233842796.33.WAV|b)
 == Begin MixMonitor Recording SIP/6011-088ce498
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6005' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6011'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6005/CallTrace to 6011
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6005|20|tkKT|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6005|20|tkKT|)
   -- Called 6005
Extension Changed 6005[default-local] new state Ringing for Notify User 6000
Extension Changed 6005[default-local] new state Ringing for Notify User 6002
   -- SIP/6005-088e9c08 is ringing
   -- SIP/6005-088e9c08 answered SIP/6011-088ce498
Extension Changed 6005[default-local] new state InUse for Notify User 6000
Extension Changed 6005[default-local] new state InUse for Notify User 6002
   -- Started music on hold, class 'default', on SIP/6011-088ce498
   -- <SIP/6005-088e9c08> Playing 'pbx-transfer' (language 'en')
   -- Stopped music on hold on SIP/6011-088ce498
Extension Changed 6005[default-local] new state Idle for Notify User 6000
Extension Changed 6005[default-local] new state Idle for Notify User 6002
   -- AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php completed, returning 0
 == Channel 'SIP/6011-088ce498' jumping out of macro 'default-dial'
   -- Executing [6010@default-super:1] GotoIf("SIP/6011-088ce498", "0?3") in new stack
   -- Executing [6010@default-super:2] Set("SIP/6011-088ce498", "GROUP(OUTGOING)=6011") in new stack
   -- Executing [6010@default-super:3] Set("SIP/6011-088ce498", "OUTBOUND_GROUP_ONCE=6010@INCOMING") in new stack
   -- Executing [6010@default-super:4] Set("SIP/6011-088ce498", "GROUPCOUNT=0") in new stack
   -- Executing [6010@default-super:5] Set("SIP/6011-088ce498", "GROUPCOUNT2=0") in new stack
   -- Executing [6010@default-super:6] Set("SIP/6011-088ce498", "DB(default/wrapup/6010/lastcall)=1233842796.33") in new stack
   -- Executing [6010@default-super:7] Macro("SIP/6011-088ce498", "default-dial|SIP/6010|6010|default|20|en|b6010@default|twWkK||default||Local/0@default-local/n|vm") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("SIP/6011-088ce498", ""CALL TO LOCAL EXTENSION FROM 6011(6011)"") in new stack
   -- Executing [s@macro-default-dial:2] AGI("SIP/6011-088ce498", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6010' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
   -- AGI Script Executing Application: (MixMonitor) Options: (6011:_1233842796.33.WAV|b)
 == Begin MixMonitor Recording SIP/6011-088ce498
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6010' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6011'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6010/CallTrace to 6011
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6010|20|twWkKT|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6010|20|twWkKT|)
   -- Called 6010
Extension Changed 6010[default-local] new state Ringing for Notify User 6000
Extension Changed 6010[default-local] new state Ringing for Notify User 6002
   -- SIP/6010-b7d17430 is ringing
   -- SIP/6010-b7d17430 answered SIP/6011-088ce498
Extension Changed 6010[default-local] new state InUse for Notify User 6000
Extension Changed 6010[default-local] new state InUse for Notify User 6002
   -- Started music on hold, class 'default', on SIP/6011-088ce498
   -- <SIP/6010-b7d17430> Playing 'pbx-transfer' (language 'en')
   -- Stopped music on hold on SIP/6011-088ce498
Extension Changed 6010[default-local] new state Idle for Notify User 6000
Extension Changed 6010[default-local] new state Idle for Notify User 6002
   -- AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php completed, returning 0
 == Channel 'SIP/6011-088ce498' jumping out of macro 'default-dial'
   -- Executing [6002@default-hotdesksuper:1] AGI("SIP/6011-088ce498", "/var/www/scopserv/telephony/scripts/agi/hotdesk.php|default|dial") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/hotdesk.php
   -- AGI Script Executing Application: (Goto) Options: (default-super|6005|1)
   -- Goto (default-super,6005,1)
   -- AGI Script /var/www/scopserv/telephony/scripts/agi/hotdesk.php completed, returning 0
   -- Executing [6005@default-super:1] GotoIf("SIP/6011-088ce498", "0?3") in new stack
   -- Executing [6005@default-super:2] Set("SIP/6011-088ce498", "GROUP(OUTGOING)=6011") in new stack
   -- Executing [6005@default-super:3] Set("SIP/6011-088ce498", "OUTBOUND_GROUP_ONCE=6005@INCOMING") in new stack
   -- Executing [6005@default-super:4] Set("SIP/6011-088ce498", "DB(default/wrapup/6005/lastcall)=1233842796.33") in new stack
   -- Executing [6005@default-super:5] Macro("SIP/6011-088ce498", "default-dial|SIP/6005|6005|default|20|en|b6005@default|tkK||default||Local/0@default-local/n|vm") in new stack
   -- Executing [s@macro-default-dial:1] NoOp("SIP/6011-088ce498", ""CALL TO LOCAL EXTENSION FROM 6011(6011)"") in new stack
   -- Executing [s@macro-default-dial:2] AGI("SIP/6011-088ce498", "/var/www/scopserv/telephony/scripts/agi/dial.php") in new stack
   -- Launched AGI Script /var/www/scopserv/telephony/scripts/agi/dial.php
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Added extension '6005' to extension map.
   -- AGI Script Executing Application: (SetMusicOnHold) Options: (default)
   -- AGI Script Executing Application: (MixMonitor) Options: (6011:_1233842796.33.WAV|b)
 == Begin MixMonitor Recording SIP/6011-088ce498
 == Parsing '/etc/asterisk/manager.conf': Found
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Extension State for '6005' is '0'.
   -- AGI Script Executing Application: (NoOp) Options: (STATUS:)
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: -------------------------------------------------------------------------------
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Doing the action dial
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Caller ID number is '6011'
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: DbSet default/6005/CallTrace to 6011
 ==  /var/www/scopserv/telephony/scripts/agi/dial.php: Dial string is SIP/6005|20|tkKT|.
   -- AGI Script Executing Application: (Dial) Options: (SIP/6005|20|tkKT|)
Extension Changed 6005[default-local] new state Ringing for Notify User 6000
Extension Changed 6005[default-local] new state Ringing for Notify User 6002
   -- Called 6005
   -- SIP/6005-b7d18a78 is ringing
   -- SIP/6005-b7d18a78 answered SIP/6011-088ce498
Extension Changed 6005[default-local] new state InUse for Notify User 6000
Extension Changed 6005[default-local] new state InUse for Notify User 6002
   -- Executing [h@macro-default-dial:1] ResetCDR("SIP/6011-088ce498", "w") in new stack
   -- Executing [h@macro-default-dial:2] NoCDR("SIP/6011-088ce498", "") in new stack
   -- Executing [h@macro-default-dial:3] System("SIP/6011-088ce498", "/var/www/scopserv/telephony/scripts/billing/cdr.sh 1233842796.33") in new stack
Extension Changed 6005[default-local] new state Idle for Notify User 6000
Extension Changed 6005[default-local] new state Idle for Notify User 6002
 == Spawn extension (macro-default-dial, s, 2) exited non-zero on 'SIP/6011-088ce498' in macro 'default-dial'
 == Spawn extension (default-super, 6005, 5) exited non-zero on 'SIP/6011-088ce498'
[Feb  5 09:06:54] NOTICE[16659]: app_mixmonitor.c:138 mixmonitor_ds_destroy: DESTROY!
[Feb  5 09:06:54] NOTICE[16659]: app_mixmonitor.c:138 mixmonitor_ds_destroy: DESTROY!
[Feb  5 09:06:54] NOTICE[16659]: app_mixmonitor.c:138 mixmonitor_ds_destroy: DESTROY!
 == End MixMonitor Recording SIP/6011-088ce498
[Feb  5 09:06:54] NOTICE[16661]: app_mixmonitor.c:254 mixmonitor_thread: FREE!!!
 == End MixMonitor Recording SIP/6011-088ce498
[Feb  5 09:06:54] NOTICE[16888]: app_mixmonitor.c:254 mixmonitor_thread:  Extension Changed 6011[default-local] new state Idle for Notify User 6000
FREE!!!>
 == End MixMonitor Recording SIP/6011-088ce498
[Feb  5 09:06:54] NOTICE[16747]: app_mixmonitor.c:254 mixmonitor_thread: FREE!!!
lab*CLI>

By: David Brillert (aragon) 2009-02-05 08:35:16.000-0600

oops I found some weird in my dial plan.
Give me some time to re-test before you reply to my previous note

By: David Brillert (aragon) 2009-02-05 08:42:21.000-0600

While I was looking at my own posted CLI capture I noticed I failed to remove a hotdesk script for my tests.

I cleaned up my mess and re-tested both patches.

Both patches are good.
*1 and *2 and all SIP transfers are working as expected without segfaults and can be re-used with mixmonitor in dial plan.

This bug can be closed out as a result of both patches.

Thanks, and sorry about my goof.

By: Mark Michelson (mmichelson) 2009-02-05 11:13:43.000-0600

Thanks for the testing. Just as a word of warning, the patch that I actually merge into Asterisk will be the same as what is attached here, but I don't like some of the variable names I used, and I plan on adding some comments to the code, too. I just thought that I would make absolutely sure you understood that so you didn't think I either made a mistake or committed untested code.

By: Digium Subversion (svnbot) 2009-02-05 11:34:34.000-0600

Repository: asterisk
Revision: 173559

U   branches/1.4/apps/app_mixmonitor.c

------------------------------------------------------------------------
r173559 | mmichelson | 2009-02-05 11:34:33 -0600 (Thu, 05 Feb 2009) | 25 lines

Fix a problem where a channel pointer becomes invalid due to masquerading or hanging up.

app_mixmonitor runs its own thread to monitor the channel's activity and write the mixed
audio to a file. Since this thread runs independently of the channel, it is possible that
the mixmonitor thread's channel pointer will point to freed memory when the channel either
is masqueraded or hangs up (technically, both cases are hangups, but we need to handle the
cases slightly differently).

The solution for this is to employ a datastore, which has the nice benefit of allowing us
to hook into channel masquerades and hangups and update our pointer as necessary. If this
looks familiar, this same technique is employed in app_chanspy. app_chanspy is a bit more
involved since it does a lot more operations on the channel that is being spied upon.

app_mixmonitor does have an extra touch that app_chanspy doesn't have, though. Since there
is a thread race between the channel's thread and the mixmonitor thread on a hangup, we em-
ploy a condition-and-boolean combination to ensure that the channel thread finishes with
our structure before the mixmonitor thread attempts to free it. No crashes!

(closes issue ASTERISK-13488)
Reported by: aragon
Patches:
 14374.patch uploaded by putnopvut (license 60)
Tested by: aragon, putnopvut


------------------------------------------------------------------------

http://svn.digium.com/view/asterisk?view=rev&revision=173559

By: Digium Subversion (svnbot) 2009-02-05 12:34:20.000-0600

Repository: asterisk
Revision: 173589

_U  trunk/
U   trunk/apps/app_mixmonitor.c

------------------------------------------------------------------------
r173589 | mmichelson | 2009-02-05 12:34:20 -0600 (Thu, 05 Feb 2009) | 33 lines

Merged revisions 173559 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r173559 | mmichelson | 2009-02-05 11:34:33 -0600 (Thu, 05 Feb 2009) | 25 lines

Fix a problem where a channel pointer becomes invalid due to masquerading or hanging up.

app_mixmonitor runs its own thread to monitor the channel's activity and write the mixed
audio to a file. Since this thread runs independently of the channel, it is possible that
the mixmonitor thread's channel pointer will point to freed memory when the channel either
is masqueraded or hangs up (technically, both cases are hangups, but we need to handle the
cases slightly differently).

The solution for this is to employ a datastore, which has the nice benefit of allowing us
to hook into channel masquerades and hangups and update our pointer as necessary. If this
looks familiar, this same technique is employed in app_chanspy. app_chanspy is a bit more
involved since it does a lot more operations on the channel that is being spied upon.

app_mixmonitor does have an extra touch that app_chanspy doesn't have, though. Since there
is a thread race between the channel's thread and the mixmonitor thread on a hangup, we em-
ploy a condition-and-boolean combination to ensure that the channel thread finishes with
our structure before the mixmonitor thread attempts to free it. No crashes!

(closes issue ASTERISK-13488)
Reported by: aragon
Patches:
 14374.patch uploaded by putnopvut (license 60)
Tested by: aragon, putnopvut


........

------------------------------------------------------------------------

http://svn.digium.com/view/asterisk?view=rev&revision=173589

By: Digium Subversion (svnbot) 2009-02-05 12:39:35.000-0600

Repository: asterisk
Revision: 173590

_U  branches/1.6.0/
U   branches/1.6.0/apps/app_mixmonitor.c

------------------------------------------------------------------------
r173590 | mmichelson | 2009-02-05 12:39:35 -0600 (Thu, 05 Feb 2009) | 41 lines

Merged revisions 173589 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk

................
r173589 | mmichelson | 2009-02-05 12:34:06 -0600 (Thu, 05 Feb 2009) | 33 lines

Merged revisions 173559 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r173559 | mmichelson | 2009-02-05 11:34:33 -0600 (Thu, 05 Feb 2009) | 25 lines

Fix a problem where a channel pointer becomes invalid due to masquerading or hanging up.

app_mixmonitor runs its own thread to monitor the channel's activity and write the mixed
audio to a file. Since this thread runs independently of the channel, it is possible that
the mixmonitor thread's channel pointer will point to freed memory when the channel either
is masqueraded or hangs up (technically, both cases are hangups, but we need to handle the
cases slightly differently).

The solution for this is to employ a datastore, which has the nice benefit of allowing us
to hook into channel masquerades and hangups and update our pointer as necessary. If this
looks familiar, this same technique is employed in app_chanspy. app_chanspy is a bit more
involved since it does a lot more operations on the channel that is being spied upon.

app_mixmonitor does have an extra touch that app_chanspy doesn't have, though. Since there
is a thread race between the channel's thread and the mixmonitor thread on a hangup, we em-
ploy a condition-and-boolean combination to ensure that the channel thread finishes with
our structure before the mixmonitor thread attempts to free it. No crashes!

(closes issue ASTERISK-13488)
Reported by: aragon
Patches:
 14374.patch uploaded by putnopvut (license 60)
Tested by: aragon, putnopvut


........

................

------------------------------------------------------------------------

http://svn.digium.com/view/asterisk?view=rev&revision=173590

By: Digium Subversion (svnbot) 2009-02-05 12:42:12.000-0600

Repository: asterisk
Revision: 173591

_U  branches/1.6.1/
U   branches/1.6.1/apps/app_mixmonitor.c

------------------------------------------------------------------------
r173591 | mmichelson | 2009-02-05 12:42:12 -0600 (Thu, 05 Feb 2009) | 41 lines

Merged revisions 173589 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk

................
r173589 | mmichelson | 2009-02-05 12:34:06 -0600 (Thu, 05 Feb 2009) | 33 lines

Merged revisions 173559 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r173559 | mmichelson | 2009-02-05 11:34:33 -0600 (Thu, 05 Feb 2009) | 25 lines

Fix a problem where a channel pointer becomes invalid due to masquerading or hanging up.

app_mixmonitor runs its own thread to monitor the channel's activity and write the mixed
audio to a file. Since this thread runs independently of the channel, it is possible that
the mixmonitor thread's channel pointer will point to freed memory when the channel either
is masqueraded or hangs up (technically, both cases are hangups, but we need to handle the
cases slightly differently).

The solution for this is to employ a datastore, which has the nice benefit of allowing us
to hook into channel masquerades and hangups and update our pointer as necessary. If this
looks familiar, this same technique is employed in app_chanspy. app_chanspy is a bit more
involved since it does a lot more operations on the channel that is being spied upon.

app_mixmonitor does have an extra touch that app_chanspy doesn't have, though. Since there
is a thread race between the channel's thread and the mixmonitor thread on a hangup, we em-
ploy a condition-and-boolean combination to ensure that the channel thread finishes with
our structure before the mixmonitor thread attempts to free it. No crashes!

(closes issue ASTERISK-13488)
Reported by: aragon
Patches:
 14374.patch uploaded by putnopvut (license 60)
Tested by: aragon, putnopvut


........

................

------------------------------------------------------------------------

http://svn.digium.com/view/asterisk?view=rev&revision=173591