From: Terry Wilson Date: Thu, 9 Dec 2010 20:48:44 +0000 (+0000) Subject: Don't crash after Set(CDR(userfield)=...) in ast_bridge_call X-Git-Tag: 1.8.2-rc1~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b42d70951bd76438a39019c590caf17a1a56657e;p=thirdparty%2Fasterisk.git 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/branches/1.8@297952 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/features.c b/main/features.c index 2c9954c242..220a6eb111 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 */ } }