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
This commit is contained in:
parent
7dd64ff993
commit
f7caf4e249
|
@ -4072,9 +4072,13 @@ static void publish_blind_transfer(int is_external, enum ast_transfer_result res
|
|||
struct ast_bridge_channel_pair pair;
|
||||
pair.channel = transferer;
|
||||
pair.bridge = bridge;
|
||||
ast_bridge_lock(bridge);
|
||||
if (bridge) {
|
||||
ast_bridge_lock(bridge);
|
||||
}
|
||||
ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten);
|
||||
ast_bridge_unlock(bridge);
|
||||
if (bridge) {
|
||||
ast_bridge_unlock(bridge);
|
||||
}
|
||||
}
|
||||
|
||||
enum ast_transfer_result ast_bridge_transfer_blind(int is_external,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
Loading…
Reference in New Issue