]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 245945 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Wed, 10 Feb 2010 14:09:38 +0000 (14:09 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Wed, 10 Feb 2010 14:09:38 +0000 (14:09 +0000)
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

configs/extensions.conf.sample
funcs/func_strings.c

index ef9efe2681fc3eb276e5556167b42d89264ef1b7..4e5409486f9896bbcee48ec171a477d0ebf7e0db 100644 (file)
@@ -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
index e62631774d01736be16847916fcfbddcd48f1da2..29fc6bdd37f9cd30cffee9d53746876b2ccb61eb 100644 (file)
@@ -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);