diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-02-10 14:09:28 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-02-10 14:09:28 +0000 |
commit | 873529b5182895547c19fac3c2ed4216e4ac894e (patch) | |
tree | 9f373427d35e677a33ee5239f9ee00db4c5efd4d /funcs/func_strings.c | |
parent | 4dee3a1fc33b6eba905729e0651e4062c9a12a24 (diff) |
Merged revisions 245945 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r245945 | tilghman | 2010-02-10 08:06:12 -0600 (Wed, 10 Feb 2010) | 9 lines
Merged revisions 245944 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r245944 | tilghman | 2010-02-10 07:37:13 -0600 (Wed, 10 Feb 2010) | 2 lines
Include examples of FILTER usage in extension patterns where a "." may be a risk.
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@245946 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs/func_strings.c')
-rw-r--r-- | funcs/func_strings.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/funcs/func_strings.c b/funcs/func_strings.c index 7d740fd00..809d8e74d 100644 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -90,8 +90,9 @@ static int filter(struct ast_channel *chan, const char *cmd, char *parse, char * char *outbuf = buf, ac; char allowed[256] = ""; size_t allowedlen = 0; + int32_t bitfield[8] = { 0, }; /* 256 bits */ - AST_STANDARD_APP_ARGS(args, parse); + AST_STANDARD_RAW_ARGS(args, parse); if (!args.string) { ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>,<string>)\n"); @@ -116,16 +117,23 @@ static int filter(struct ast_channel *chan, const char *cmd, char *parse, char * * Looks a little strange, until you realize that we can overflow * the size of a char. */ - for (ac = c1; ac != c2 && allowedlen < sizeof(allowed) - 1; ac++) - allowed[allowedlen++] = ac; - allowed[allowedlen++] = ac; + for (ac = c1; ac != c2; ac++) { + bitfield[ac / 32] |= 1 << (ac % 32); + } ast_debug(4, "c1=%d, c2=%d\n", c1, c2); /* Decrement before the loop increment */ (args.allowed)--; - } else - allowed[allowedlen++] = c1; + } else { + bitfield[c1 / 32] |= 1 << (c1 % 32); + } + } + + for (ac = 1; ac != 0; ac++) { + if (bitfield[ac / 32] & (1 << (ac % 32))) { + allowed[allowedlen++] = ac; + } } ast_debug(1, "Allowed: %s\n", allowed); |