]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Don't crash after Set(CDR(userfield)=...) in ast_bridge_call
authorTerry Wilson <twilson@digium.com>
Thu, 9 Dec 2010 20:48:44 +0000 (20:48 +0000)
committerTerry Wilson <twilson@digium.com>
Thu, 9 Dec 2010 20:48:44 +0000 (20:48 +0000)
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

main/features.c

index 2c9954c242eef65425a8b1ef4cad64c57765d4f7..220a6eb111e6413b9ad49648cdfcb513f4abf79f 100644 (file)
@@ -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  */
                }
        }