summaryrefslogtreecommitdiff
path: root/main/bridge_basic.c
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2014-04-28 20:07:37 +0000
committerKinsey Moore <kmoore@digium.com>2014-04-28 20:07:37 +0000
commitf7caf4e249af1f1cecf4d318c59e762597631811 (patch)
tree5060b162b1cccf84bf2a006495c5b7fa0e3fac72 /main/bridge_basic.c
parent7dd64ff993261da54d96a320ea261c32b622d9b1 (diff)
Bridging: Don't lock NULL bridges
When bridge locking was added for bridge snapshot creation, some locations where bridge locking was added were not guaranteed to actually have a bridge and locking NULL AO2 objects tends to cause segfaults. This ensures that NULL bridges aren't locked. ........ Merged revisions 413073 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@413074 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/bridge_basic.c')
-rw-r--r--main/bridge_basic.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/main/bridge_basic.c b/main/bridge_basic.c
index 253aa3516..9a49b427b 100644
--- a/main/bridge_basic.c
+++ b/main/bridge_basic.c
@@ -1534,11 +1534,23 @@ static void publish_transfer_success(struct attended_transfer_properties *props)
.bridge = props->target_bridge,
};
- ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ if (transferee.bridge && transfer_target.bridge) {
+ ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ } else if (transferee.bridge) {
+ ast_bridge_lock(transferee.bridge);
+ } else if (transfer_target.bridge) {
+ ast_bridge_lock(transfer_target.bridge);
+ }
+
ast_bridge_publish_attended_transfer_bridge_merge(0, AST_BRIDGE_TRANSFER_SUCCESS,
&transferee, &transfer_target, props->transferee_bridge);
- ast_bridge_unlock(transferee.bridge);
- ast_bridge_unlock(transfer_target.bridge);
+
+ if (transferee.bridge) {
+ ast_bridge_unlock(transferee.bridge);
+ }
+ if (transfer_target.bridge) {
+ ast_bridge_unlock(transfer_target.bridge);
+ }
}
/*!
@@ -1559,11 +1571,23 @@ static void publish_transfer_threeway(struct attended_transfer_properties *props
.bridge = props->transferee_bridge,
};
- ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ if (transferee.bridge && transfer_target.bridge) {
+ ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ } else if (transferee.bridge) {
+ ast_bridge_lock(transferee.bridge);
+ } else if (transfer_target.bridge) {
+ ast_bridge_lock(transfer_target.bridge);
+ }
+
ast_bridge_publish_attended_transfer_threeway(0, AST_BRIDGE_TRANSFER_SUCCESS,
&transferee, &transfer_target, &threeway);
- ast_bridge_unlock(transferee.bridge);
- ast_bridge_unlock(transfer_target.bridge);
+
+ if (transferee.bridge) {
+ ast_bridge_unlock(transferee.bridge);
+ }
+ if (transfer_target.bridge) {
+ ast_bridge_unlock(transfer_target.bridge);
+ }
}
/*!
@@ -1580,11 +1604,23 @@ static void publish_transfer_fail(struct attended_transfer_properties *props)
.bridge = props->target_bridge,
};
- ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ if (transferee.bridge && transfer_target.bridge) {
+ ast_bridge_lock_both(transferee.bridge, transfer_target.bridge);
+ } else if (transferee.bridge) {
+ ast_bridge_lock(transferee.bridge);
+ } else if (transfer_target.bridge) {
+ ast_bridge_lock(transfer_target.bridge);
+ }
+
ast_bridge_publish_attended_transfer_fail(0, AST_BRIDGE_TRANSFER_FAIL,
&transferee, &transfer_target);
- ast_bridge_unlock(transferee.bridge);
- ast_bridge_unlock(transfer_target.bridge);
+
+ if (transferee.bridge) {
+ ast_bridge_unlock(transferee.bridge);
+ }
+ if (transfer_target.bridge) {
+ ast_bridge_unlock(transfer_target.bridge);
+ }
}
/*!