diff options
author | Richard Mudgett <rmudgett@digium.com> | 2016-03-18 14:01:02 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2016-03-25 18:27:20 -0500 |
commit | a4189763ab562ee2e8e79fda60b213ee90aab6f1 (patch) | |
tree | efb672e9f605011f11ad227e7fa6f7b2eff3121c /res/parking/parking_bridge.c | |
parent | 01150597f60cb0e4b906b2bf2b94188bb3b6ca14 (diff) |
res_parking: Misc fixes.
res/parking/parking_applications.c:
* Add malloc fail checks in setup_park_common_datastore().
* Fix playing parking failed announcement to only happen on non-blind
transfers in park_app_exec(). It could never go out before because a test
was provedly always false.
res/parking/parking_bridge.c:
* Fix NULL tolerance in generate_parked_user() because
bridge_parking_push() can theoretically pass a NULL parker channel if the
parker channel went away for some reason.
* Clarify some weird code dealing with blind_transfer in
bridge_parking_push().
res/parking/parking_bridge_features.c:
* Made park_local_transfer() set BLINDTRANSFER on the Local;1 channel
which will be bulk copied to the Local;2 channel on the subsequent
ast_call(). The additional advantage is if the parker channel has the
BLINDTRANSFER and ATTENDEDTRANSFER variables set they are now guaranteed
to be overridden.
res/parking/parking_manager.c:
* Fix AMI Park action input range checking of the Timeout header in
manager_park().
* Reduced locking scope to where needed in manager_park().
res/res_parking.c:
* Fix some off nominal missing unlocks by eliminating the returns.
Change-Id: Ib64945bc285acb05a306dc12e6f16854898915ca
Diffstat (limited to 'res/parking/parking_bridge.c')
-rw-r--r-- | res/parking/parking_bridge.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/res/parking/parking_bridge.c b/res/parking/parking_bridge.c index 4f7198b4f..e61486e3c 100644 --- a/res/parking/parking_bridge.c +++ b/res/parking/parking_bridge.c @@ -167,7 +167,7 @@ static struct parked_user *generate_parked_user(struct parking_lot *lot, struct if (parker_dial_string) { new_parked_user->parker_dial_string = ast_strdup(parker_dial_string); } else { - if (parked_user_set_parker_dial_string(new_parked_user, parker)) { + if (!parker || parked_user_set_parker_dial_string(new_parked_user, parker)) { ao2_ref(new_parked_user, -1); ao2_unlock(lot); return NULL; @@ -269,14 +269,11 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg * the park application. It's possible that the channel that transferred it is still alive (particularly * when a multichannel bridge is parked), so try to get the real parker if possible. */ ast_channel_lock(bridge_channel->chan); - blind_transfer = S_OR(pbx_builtin_getvar_helper(bridge_channel->chan, "BLINDTRANSFER"), - ast_channel_name(bridge_channel->chan)); - if (blind_transfer) { - blind_transfer = ast_strdupa(blind_transfer); - } + blind_transfer = pbx_builtin_getvar_helper(bridge_channel->chan, "BLINDTRANSFER"); + blind_transfer = ast_strdupa(S_OR(blind_transfer, "")); ast_channel_unlock(bridge_channel->chan); - - if (parker == bridge_channel->chan) { + if ((!parker || parker == bridge_channel->chan) + && !ast_strlen_zero(blind_transfer)) { struct ast_channel *real_parker = ast_channel_get_by_name(blind_transfer); if (real_parker) { @@ -300,8 +297,8 @@ static int bridge_parking_push(struct ast_bridge_parking *self, struct ast_bridg /* Generate ParkedCall Stasis Message */ publish_parked_call(pu, PARKED_CALL); - /* If the parkee and the parker are the same and silence_announce isn't set, play the announcement to the parkee */ - if (!strcmp(blind_transfer, ast_channel_name(bridge_channel->chan)) && !park_datastore->silence_announce) { + /* If not a blind transfer and silence_announce isn't set, play the announcement to the parkee */ + if (ast_strlen_zero(blind_transfer) && !park_datastore->silence_announce) { char saynum_buf[16]; snprintf(saynum_buf, sizeof(saynum_buf), "%d %d", 0, pu->parking_space); |