From: Tilghman Lesher Date: Wed, 10 Feb 2010 14:09:38 +0000 (+0000) Subject: Merged revisions 245945 via svnmerge from X-Git-Tag: 1.6.1.18-rc1~54 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31bafc03f3367253dccc32d56659a97615f29966;p=thirdparty%2Fasterisk.git 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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@245947 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/configs/extensions.conf.sample b/configs/extensions.conf.sample index ef9efe2681..4e5409486f 100644 --- a/configs/extensions.conf.sample +++ b/configs/extensions.conf.sample @@ -316,7 +316,7 @@ exten => _91700XXXXXXX,1,Dial(IAX2/${GLOBAL(IAXINFO)}@iaxtel.com/${EXTEN:1}@iaxt ; International long distance through trunk ; exten => _9011.,1,Macro(dundi-e164,${EXTEN:4}) -exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) +exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${FILTER(0-9,${EXTEN:${GLOBAL(TRUNKMSD)}})}) [trunkld] ; @@ -624,7 +624,7 @@ include => demo ; An extension like the one below can be used for FWD, Nikotel, sipgate etc. ; Note that you must have a [sipprovider] section in sip.conf ; -;exten => _41X.,1,Dial(SIP/${EXTEN:2}@sipprovider,,r) +;exten => _41X.,1,Dial(SIP/${FILTER(0-9,${EXTEN:2})}@sipprovider,,r) ; Real extensions would go here. Generally you want real extensions to be ; 4 or 5 digits long (although there is no such requirement) and start with a diff --git a/funcs/func_strings.c b/funcs/func_strings.c index e62631774d..29fc6bdd37 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(,)\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);