From: Mark Michelson Date: Tue, 17 Jun 2014 18:40:35 +0000 (+0000) Subject: Allow the PUSH and UNSHIFT functions to set inheritable channel variables. X-Git-Tag: 11.11.0-rc1~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc7bc40c2abcb938b336301e6b0b5ff53b6d1cd1;p=thirdparty%2Fasterisk.git Allow the PUSH and UNSHIFT functions to set inheritable channel variables. ........ Merged revisions 416500 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@416501 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/funcs/func_strings.c b/funcs/func_strings.c index e8ec3fcf83..85734508ff 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)) {