]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Interesting crash. In this case, you exit the
authorSteve Murphy <murf@digium.com>
Fri, 17 Oct 2008 17:18:31 +0000 (17:18 +0000)
committerSteve Murphy <murf@digium.com>
Fri, 17 Oct 2008 17:18:31 +0000 (17:18 +0000)
bridge with peer completely GONE.

I moved the channel find call up to cover the
whole peer CDR reset code segment. This appears
to solve the crash without changing the logic
at all.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@150637 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_features.c

index 6b5bc6b18f02a5dc367b3c20407131c5194e98e9..57a309ad889800a6ca3ce4d488cd995a6fe0e2f4 100644 (file)
@@ -1812,9 +1812,9 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                } else {
                        ast_cdr_specialized_reset(chan_cdr,0); /* nothing changed, reset the chan_cdr  */
                }
-               if (strcasecmp(orig_peername, peer->name) != 0) { 
+               chan_ptr = ast_get_channel_by_name_locked(orig_peername);
+               if (chan_ptr && strcasecmp(orig_peername, peer->name) != 0) { 
                        /* old channel */
-                       chan_ptr = ast_get_channel_by_name_locked(orig_peername);
                        if (chan_ptr) {
                                if (!ast_bridged_channel(chan_ptr)) {
                                        struct ast_cdr *cur;
@@ -1826,13 +1826,15 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                                        if (cur)
                                                ast_cdr_specialized_reset(peer_cdr,0);
                                }
-                               ast_channel_unlock(chan_ptr);
                        }
                        /* new channel */
                        ast_cdr_specialized_reset(new_peer_cdr,0);
                } else {
-                       ast_cdr_specialized_reset(peer_cdr,0); /* nothing changed, reset the peer_cdr  */
+                       if (chan_ptr)
+                               ast_cdr_specialized_reset(peer_cdr,0); /* nothing changed, reset the peer_cdr  */
                }
+               if (chan_ptr)
+                       ast_channel_unlock(chan_ptr);
        }
        return res;
 }