summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/extensions.conf.sample4
-rw-r--r--funcs/func_strings.c60
2 files changed, 56 insertions, 8 deletions
diff --git a/configs/extensions.conf.sample b/configs/extensions.conf.sample
index 5d7420110..e68879f6e 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 afabb0f12..34bff1e55 100644
--- a/funcs/func_strings.c
+++ b/funcs/func_strings.c
@@ -38,6 +38,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/utils.h"
#include "asterisk/app.h"
#include "asterisk/localtime.h"
+#include "asterisk/test.h"
AST_THREADSTORAGE(result_buf);
AST_THREADSTORAGE(tmp_buf);
@@ -593,8 +594,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");
@@ -619,16 +621,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);
@@ -1421,10 +1430,48 @@ static struct ast_custom_function passthru_function = {
.read2 = passthru,
};
+#ifdef TEST_FRAMEWORK
+AST_TEST_DEFINE(test_FILTER)
+{
+ int i, res = AST_TEST_PASS;
+ const char *test_strings[][2] = {
+ {"A-R", "DAHDI"},
+ {"A\\-R", "A"},
+ {"\\x41-R", "DAHDI"},
+ {"0-9A-Ca-c", "0042133333A12212"},
+ {"0-9a-cA-C_+\\-", "0042133333A12212"},
+ {NULL, NULL},
+ };
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "func_FILTER_test";
+ info->category = "funcs/func_strings/";
+ info->summary = "Test FILTER function";
+ info->description = "Verify FILTER behavior";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ for (i = 0; test_strings[i][0]; i++) {
+ char tmp[256], tmp2[256] = "";
+ snprintf(tmp, sizeof(tmp), "${FILTER(%s,0042133333&DAHDI/g1/2212)}", test_strings[i][0]);
+ pbx_substitute_variables_helper(NULL, tmp, tmp2, sizeof(tmp2) - 1);
+ if (strcmp(test_strings[i][1], tmp2)) {
+ ast_test_status_update(test, "Format string '%s' substituted to '%s'. Expected '%s'.\n", test_strings[i][0], tmp2, test_strings[i][1]);
+ res = AST_TEST_FAIL;
+ }
+ }
+ return res;
+}
+#endif
+
static int unload_module(void)
{
int res = 0;
+ AST_TEST_UNREGISTER(test_FILTER);
res |= ast_custom_function_unregister(&fieldqty_function);
res |= ast_custom_function_unregister(&filter_function);
res |= ast_custom_function_unregister(&replace_function);
@@ -1456,6 +1503,7 @@ static int load_module(void)
{
int res = 0;
+ AST_TEST_REGISTER(test_FILTER);
res |= ast_custom_function_register(&fieldqty_function);
res |= ast_custom_function_register(&filter_function);
res |= ast_custom_function_register(&replace_function);