Skip to content
This repository has been archived by the owner on Jan 14, 2020. It is now read-only.

Commit

Permalink
Bridging: Don't lock NULL bridges
Browse files Browse the repository at this point in the history
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: http://svn.asterisk.org/svn/asterisk/trunk@413074 f38db490-d61c-443f-a65b-d21fe96a405b
  • Loading branch information
Kinsey Moore committed Apr 28, 2014
1 parent d1d0028 commit cedbce3
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 11 deletions.
8 changes: 6 additions & 2 deletions main/bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
54 changes: 45 additions & 9 deletions main/bridge_basic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

/*!
Expand All @@ -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);
}
}

/*!
Expand All @@ -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);
}
}

/*!
Expand Down

0 comments on commit cedbce3

Please sign in to comment.