aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-12 15:46:08 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-12 15:46:08 +0000
commit8c9c49e870c9d783cfc1e01a78a7e681937b7fca (patch)
treeb94f5d7f72a042fd9518bc5330f178ef724847d5 /res
parent2a09b4f12f3ded439eb4d7155e413315870a876f (diff)
(closes issue #12193)
Reported by: davidw Patch by: Corydon76, modified by me to work properly with ParkAndAnnounce app git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@122208 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_features.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/res/res_features.c b/res/res_features.c
index 32f01ee2f..e275a8c33 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -326,14 +326,26 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
/* Check for channel variable PARKINGEXTEN */
parkingexten = pbx_builtin_getvar_helper(chan, "PARKINGEXTEN");
if (!ast_strlen_zero(parkingexten)) {
- if (ast_exists_extension(NULL, 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_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten);
+ ast_mutex_unlock(&parking_lock);
+ free(pu);
+ return 1; /* Continue execution if possible */
+ }
+ snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
+
+ if (ast_exists_extension(NULL, parking_con, pu->parkingexten, 1, NULL)) {
ast_mutex_unlock(&parking_lock);
free(pu);
ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parking_con);
return 1; /* Continue execution if possible */
}
- ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
- x = atoi(parkingexten);
} else {
/* Select parking space within range */
parking_range = parking_stop - parking_start+1;
@@ -358,6 +370,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
/* Set pointer for next parking */
if (parkfindnext)
parking_offset = x - parking_start + 1;
+ snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", x);
}
chan->appl = "Parked Call";
@@ -398,8 +411,6 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "Parked %s on %d@%s. Will timeout back to extension [%s] %s, %d in %d seconds\n", pu->chan->name, pu->parkingnum, parking_con, 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"
@@ -424,7 +435,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
if (!con) /* Still no context? Bad */
ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parking_con);
/* Tell the peer channel the number of the parking space */
- if (peer && ((pu->parkingnum != -1 && ast_strlen_zero(orig_chan_name)) || !strcasecmp(peer->name, orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */
+ if (peer && (ast_strlen_zero(orig_chan_name) || !strcasecmp(peer->name, orig_chan_name))) { /* Only say number if it's a number and the channel hasn't been masqueraded away */
/* Make sure we don't start saying digits to the channel being parked */
ast_set_flag(peer, AST_FLAG_MASQ_NOSTREAM);
ast_say_digits(peer, pu->parkingnum, "", peer->language);
@@ -458,6 +469,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))) {
@@ -480,7 +492,12 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int
orig_chan_name = ast_strdupa(chan->name);
- park_call_full(chan, peer, timeout, extout, orig_chan_name);
+ park_status = park_call_full(chan, peer, timeout, extout, orig_chan_name);
+ if (park_status == 1) {
+ /* would be nice to play: "invalid parking extension" */
+ ast_hangup(chan);
+ return -1;
+ }
return 0;
}