From 5ce016b4633e57335223d687bc9087de204de3cb Mon Sep 17 00:00:00 2001
From: Terry Wilson <twilson@digium.com>
Date: Thu, 9 Dec 2010 21:26:19 +0000
Subject: [PATCH] Merged revisions 297952 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r297952 | twilson | 2010-12-09 14:48:44 -0600 (Thu, 09 Dec 2010) | 10 lines

  Don't crash after Set(CDR(userfield)=...) in ast_bridge_call

  Instead of setting peer->cdr = NULL, set it to not post.

  (closes issue #18415)
  Reported by: macbrody
  Patches:
        patch-18415 uploaded by jsolares (license 1167)
  Tested by: jsolares, twilson
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@297956 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/features.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/main/features.c b/main/features.c
index 9128a58cdd..0afb17e95e 100644
--- a/main/features.c
+++ b/main/features.c
@@ -3091,6 +3091,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
 	int hasfeatures=0;
 	int hadfeatures=0;
 	int autoloopflag;
+	int we_disabled_peer_cdr = 0;
 	struct ast_option_header *aoh;
 	struct ast_cdr *bridge_cdr = NULL;
 	struct ast_cdr *orig_peer_cdr = NULL;
@@ -3158,9 +3159,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
 			ast_cdr_appenduserfield(chan, tmp);
 		} else
 			ast_cdr_setuserfield(chan, peer->cdr->userfield);
-		/* free the peer's cdr without ast_cdr_free complaining */
-		ast_free(peer->cdr);
-		peer->cdr = NULL;
+		/* Don't delete the CDR; just disable it. */
+		ast_set_flag(peer->cdr, AST_CDR_FLAG_POST_DISABLED);
+		we_disabled_peer_cdr = 1;
 	}
 	ast_copy_string(orig_channame,chan->name,sizeof(orig_channame));
 	ast_copy_string(orig_peername,peer->name,sizeof(orig_peername));
@@ -3600,6 +3601,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
 				ast_cdr_specialized_reset(new_peer_cdr, 0);
 			}
 		} else {
+			if (we_disabled_peer_cdr) {
+				ast_clear_flag(peer->cdr, AST_CDR_FLAG_POST_DISABLED);
+			}
 			ast_cdr_specialized_reset(peer->cdr, 0); /* nothing changed, reset the peer cdr  */
 		}
 	}
-- 
GitLab