diff --git a/main/enum.c b/main/enum.c index 344ae404d56414ff1febcb3bf4216e99d878f360..f4177f98118719517864b61462f518b78f9cbaff 100644 --- a/main/enum.c +++ b/main/enum.c @@ -414,6 +414,7 @@ static int parse_naptr(unsigned char *dst, int dstsize, char *tech, int techsize int size, matchindex; /* size is the size of the backreference sub. */ size_t d_len = sizeof(tempdst) - 1; regex_t preg; + int re_flags = REG_EXTENDED | REG_NEWLINE; regmatch_t pmatch[max_bt]; tech_return[0] = '\0'; @@ -495,13 +496,23 @@ static int parse_naptr(unsigned char *dst, int dstsize, char *tech, int techsize * and uses that character to find the index of the second delimiter */ delim = regexp[0]; delim2 = strchr(regexp + 1, delim); - if ((delim2 == NULL) || (regexp[regexp_len - 1] != delim)) { /* is the second delimiter found, and is the end of the regexp a delimiter */ + if ((delim2 == NULL) + || ((regexp[regexp_len - 1] != 'i' || regexp[regexp_len - 2] != delim) + && regexp[regexp_len - 1] != delim)) { ast_log(LOG_WARNING, "Regex delimiter error (on \"%s\").\n", regexp); return -1; } else if (strchr((delim2 + 1), delim) == NULL) { /* if the second delimiter is found, make sure there is a third instance. this could be the end one instead of the middle */ ast_log(LOG_WARNING, "Regex delimiter error (on \"%s\").\n", regexp); return -1; } + + /* Make the regex case-insensitive if the 'i' flag is present. This assumes you + * aren't using 'i' as a delimiter which, altough dubious, does not appear to be + * explicitly non-compliant */ + if (regexp[regexp_len - 1] == 'i') { + re_flags |= REG_ICASE; + } + pattern = regexp + 1; /* pattern is the regex without the begining and ending delimiter */ *delim2 = 0; /* zero out the middle delimiter */ subst = delim2 + 1; /* dst substring is everything after the second delimiter. */ @@ -511,7 +522,7 @@ static int parse_naptr(unsigned char *dst, int dstsize, char *tech, int techsize * now do the regex wizardry. */ - if (regcomp(&preg, pattern, REG_EXTENDED | REG_NEWLINE)) { + if (regcomp(&preg, pattern, re_flags)) { ast_log(LOG_WARNING, "NAPTR Regex compilation error (regex = \"%s\").\n", regexp); return -1; }