Summary:ASTERISK-05766: [patch] Channel hangs after second ForkCDR+SetCDRUserField
Reporter:Alex Zhilyakov (azhilyakov)Labels:
Date Opened:2005-12-02 17:44:07.000-0600Date Closed:2008-01-15 16:06:33.000-0600
Versions:Frequency of
exten => s,1,Answer()
exten => s,2,ForkCDR()
exten => s,3,SetCDRUserField(aaaaa)
exten => s,4,ForkCDR()
exten => s,5,SetCDRUserField(bbbbb)
exten => s,6,NoOp(OKEY)
exten => s,7,HangUp()

This script hangs after executing step 5 and never reaches step 6.

I'm using Asterisk@Home 1.5 which features Asterisk 1.0.9.


   -- Executing SetVar("SIP/", "FROM_DID=12123794030") in new stack
   -- Executing Goto("SIP/", "custom-astcard|s|1") in new stack
   -- Goto (custom-astcard,s,1)
   -- Executing Answer("SIP/", "") in new stack
   -- Executing ForkCDR("SIP/", "") in new stack
   -- Executing SetCDRUserField("SIP/", "aaaaa") in new stack
   -- Executing ForkCDR("SIP/", "") in new stack
   -- Executing SetCDRUserField("SIP/", "bbbbb") in new stack


Comments:By: Olle Johansson (oej) 2005-12-02 18:56:21.000-0600

You are using an old version of Asterisk. Please test with 1.2 and see if the problem remains.

By: Alex Zhilyakov (azhilyakov) 2005-12-02 20:11:58.000-0600

I would love to use Asterisk 1.2.0, but there is no Asterisk@Home featuring Asterisk 1.2.0 released yet, and I'm bound to @Home due to nature of the projects.

I would highly appreciate any help and advice how to resolve the given problem.

Thank you.

By: Alex Zhilyakov (azhilyakov) 2005-12-05 09:32:04.000-0600

I fixed it. The patch is below.
The problem was that cdr->next was not cleared upon cdr duplication, creating a loop on second ForkCDR().

--- apps/app_forkcdr.c.orig     2005-12-05 11:12:36.000000000 -0500
+++ apps/app_forkcdr.c  2005-12-05 11:13:36.000000000 -0500
@@ -37,6 +37,7 @@
static void ast_cdr_clone(struct ast_cdr *cdr) {
       struct ast_cdr *newcdr = ast_cdr_alloc();
       memcpy(newcdr,cdr,sizeof(struct ast_cdr));
+       newcdr->next = NULL;
       gettimeofday(&newcdr->start, NULL);
       memset(&newcdr->answer, 0, sizeof(newcdr->answer));

By: Russell Bryant (russell) 2005-12-13 00:39:36.000-0600

This is not an issue in 1.2 or the trunk, but I'll go ahead and stick this in the 1.0 branch since the patch is obviously correct.

By: Russell Bryant (russell) 2005-12-13 00:42:19.000-0600

This fix has been committed to the 1.0 branch.  It will be in 1.0.11 whenever that gets released.  I have a security fix that will be going in soon.  After that, I'll probably release it.

By: Digium Subversion (svnbot) 2008-01-15 16:06:33.000-0600

Repository: asterisk
Revision: 7467

U   branches/1.0/apps/app_forkcdr.c

r7467 | russell | 2008-01-15 16:06:32 -0600 (Tue, 15 Jan 2008) | 2 lines

properly reset the 'next' pointer when duplicating the cdr (issue ASTERISK-5766)