summaryrefslogtreecommitdiff
path: root/funcs
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2014-06-17 18:45:11 +0000
committerMark Michelson <mmichelson@digium.com>2014-06-17 18:45:11 +0000
commitfc52fd88847e9ff0dd3be7848be01ab757be97ac (patch)
treea89f5f854f5225546ac41cfac1f1acd35fdbb793 /funcs
parent351db2033c4565c6afbfdcd073a7d2fb0f70b983 (diff)
Allow the PUSH and UNSHIFT functions to set inheritable channel variables.
........ Merged revisions 416500 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 416501 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 416502 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@416503 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'funcs')
-rw-r--r--funcs/func_strings.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/funcs/func_strings.c b/funcs/func_strings.c
index c3d768384..efa4bfda7 100644
--- a/funcs/func_strings.c
+++ b/funcs/func_strings.c
@@ -1610,6 +1610,7 @@ static int unshift_push(struct ast_channel *chan, const char *cmd, char *data, c
AST_APP_ARG(var);
AST_APP_ARG(delimiter);
);
+ const char *stripped_var;
if (!(buf = ast_str_thread_get(&result_buf, 16)) ||
!(previous_value = ast_str_thread_get(&tmp_buf, 16))) {
@@ -1627,8 +1628,15 @@ static int unshift_push(struct ast_channel *chan, const char *cmd, char *data, c
ast_get_encoded_char(args.delimiter, delimiter, &unused);
}
- varsubst = ast_alloca(strlen(args.var) + 4);
- sprintf(varsubst, "${%s}", args.var);
+ /* UNSHIFT and PUSH act as ways of setting a variable, so we need to be
+ * sure to skip leading underscores if they appear. However, we only want
+ * to skip up to two since that is the maximum number that can be used to
+ * indicate variable inheritance. Any further underscores are part of the
+ * variable name.
+ */
+ stripped_var = args.var + MIN(strspn(args.var, "_"), 2);
+ varsubst = ast_alloca(strlen(stripped_var) + 4);
+ sprintf(varsubst, "${%s}", stripped_var);
ast_str_substitute_variables(&previous_value, 0, chan, varsubst);
if (!ast_str_strlen(previous_value)) {