diff options
author | Jeff Peeler <jpeeler@digium.com> | 2008-06-12 23:08:37 +0000 |
---|---|---|
committer | Jeff Peeler <jpeeler@digium.com> | 2008-06-12 23:08:37 +0000 |
commit | 84d0404ed5424a8b21b8b456579b7641e8ba8911 (patch) | |
tree | 64f1ddd83a9b115ed25af81aaa2c38ed2a93baff /main | |
parent | 54c92d9a63867b90ec0033e3b370b720a0e097c7 (diff) |
(closes issue 0012193)
Reported by: davidw
Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122433 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/features.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/main/features.c b/main/features.c index 1855ca47b..06b0a3ca6 100644 --- a/main/features.c +++ b/main/features.c @@ -494,15 +494,28 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer /* Check for channel variable PARKINGEXTEN */ parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN"); if (!ast_strlen_zero(parkingexten)) { - if (ast_exists_extension(NULL, parkinglot->parking_con, parkingexten, 1, NULL)) { + /*!\note The API forces us to specify a numeric parking slot, even + * though the architecture would tend to support non-numeric extensions + * (as are possible with SIP, for example). Hence, we enforce that + * limitation here. If extout was not numeric, we could permit + * arbitrary non-numeric extensions. + */ + if (sscanf(parkingexten, "%d", &x) != 1 || x < 0) { + AST_LIST_UNLOCK(&parkinglot->parkings); + parkinglot_unref(parkinglot); + free(pu); + ast_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten); + return 1; /* Continue execution if possible */ + } + snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); + + if (ast_exists_extension(NULL, parkinglot->parking_con, pu->parkingexten, 1, NULL)) { AST_LIST_UNLOCK(&parkinglot->parkings); parkinglot_unref(parkinglot); ast_free(pu); ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con); return 1; /* Continue execution if possible */ } - ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten)); - x = atoi(parkingexten); } else { int start; struct parkeduser *cur = NULL; @@ -544,6 +557,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer /* Set pointer for next parking */ if (parkinglot->parkfindnext) parkinglot->parking_offset = x - parkinglot->parking_start + 1; + snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); } chan->appl = "Parked Call"; @@ -595,8 +609,6 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer pthread_kill(parking_thread, SIGURG); ast_verb(2, "Parked %s on %d (lot %s). Will timeout back to extension [%s] %s, %d in %d seconds\n", pu->chan->name, pu->parkingnum, parkinglot->name, pu->context, pu->exten, pu->priority, (pu->parkingtime/1000)); - if (pu->parkingnum != -1) - snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x); manager_event(EVENT_FLAG_CALL, "ParkedCall", "Exten: %s\r\n" "Channel: %s\r\n" @@ -620,7 +632,7 @@ static int ast_park_call_full(struct ast_channel *chan, struct ast_channel *peer if (!con) /* Still no context? Bad */ ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parkinglot->parking_con); /* Tell the peer channel the number of the parking space */ - if (peer && ((pu->parkingnum != -1 && ast_strlen_zero(args->orig_chan_name)) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */ + if (peer && (ast_strlen_zero(args->orig_chan_name) || !strcasecmp(peer->name, args->orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */ /* If a channel is masqueraded into peer while playing back the parking slot number do not continue playing it back. This is the case if an attended transfer occurs. */ ast_set_flag(peer, AST_FLAG_MASQ_NOSTREAM); ast_say_digits(peer, pu->parkingnum, "", peer->language); @@ -658,6 +670,7 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int struct ast_channel *chan; struct ast_frame *f; char *orig_chan_name = NULL; + int park_status; /* Make a new, fake channel that we'll use to masquerade in the real one */ if (!(chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, rchan->accountcode, rchan->exten, rchan->context, rchan->amaflags, "Parked/%s",rchan->name))) { @@ -686,7 +699,12 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int .orig_chan_name = orig_chan_name, }; - ast_park_call_full(chan, peer, &args); + park_status = ast_park_call_full(chan, peer, &args); + if (park_status == 1) { + /* would be nice to play "invalid parking extension" */ + ast_hangup(chan); + return -1; + } } return 0; |