aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/res_features.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/res/res_features.c b/res/res_features.c
index 24b0a46b2..475c7711c 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -1678,6 +1678,22 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
ast_cdr_specialized_reset(chan->cdr,0);
}
if (peer->cdr) {
+ struct ast_cdr *cur;
+
+ ast_channel_lock(peer);
+ for (cur = peer->cdr; cur; cur = cur->next) {
+ if (cur == orig_peer_cdr) {
+ break;
+ }
+ }
+
+ if (!cur) {
+ /* orig_peer_cdr is gone, probably because of a masquerade
+ * during the bridge. */
+ ast_channel_unlock(peer);
+ return res;
+ }
+
/* before resetting the peer cdr, throw a copy of it to the
backend, just in case the cdr.conf file is calling for
unanswered CDR's. */
@@ -1694,6 +1710,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
}
}
ast_cdr_specialized_reset(orig_peer_cdr,0);
+ ast_channel_unlock(peer);
}
}
return res;