From: Alan T. DeKok Date: Sun, 25 Aug 2019 19:50:44 +0000 (-0400) Subject: move check regex flags to after we create the map X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20fca58640fb78ec9846bffe68baaee21ff96fcf;p=thirdparty%2Ffreeradius-server.git move check regex flags to after we create the map --- diff --git a/src/lib/server/cond_tokenize.c b/src/lib/server/cond_tokenize.c index f652092f717..c2992d863f5 100644 --- a/src/lib/server/cond_tokenize.c +++ b/src/lib/server/cond_tokenize.c @@ -748,11 +748,6 @@ static ssize_t cond_tokenize(TALLOC_CTX *ctx, fr_cond_t **pcond, char const **er } } else { /* it's an operator */ -#ifdef HAVE_REGEX - fr_regex_flags_t regex_flags; - - memset(®ex_flags, 0, sizeof(regex_flags)); -#endif vp_map_t *map; /* @@ -851,49 +846,6 @@ static ssize_t cond_tokenize(TALLOC_CTX *ctx, fr_cond_t **pcond, char const **er slen = tmpl_preparse(&rhs, &rhs_len, p, &rhs_type, error, NULL, regex); if (slen <= 0) return_SLEN; -#ifdef HAVE_REGEX - /* - * Sanity checks for regexes. - */ - if (regex) { - int err; - ssize_t flen; - - if (rhs[rhs_len] != '/') { - return_P("Expected regular expression"); - } - - flen = regex_flags_parse(&err, ®ex_flags, rhs + rhs_len + 1, strlen(rhs + rhs_len + 1), true); - switch (err) { - /* - * Got flags all the way to the end of the string - */ - case 0: - rad_assert(flen >= 0); - slen += (size_t)flen; - break; - - /* - * Found non-flag, this is OK. - */ - case -1: - rad_assert(flen <= 0); - fr_strerror(); /* Clear out the error buffer */ - slen += (size_t)(-flen); - break; - - case -2: - rad_assert(flen <= 0); - p = rhs + rhs_len + 1; - p += (size_t)(-flen); - return_P("Duplicate flag"); - } - } else if (!regex && (*p == '/')) { - return_P("Unexpected regular expression"); - } - -#endif - /* * Duplicate map_from_fields here, as we * want to separate parse errors in the @@ -974,7 +926,47 @@ static ssize_t cond_tokenize(TALLOC_CTX *ctx, fr_cond_t **pcond, char const **er } #ifdef HAVE_REGEX - if (tmpl_is_regex(c->data.map->rhs)) { + /* + * Parse the regex flags + */ + if (regex) { + int err; + ssize_t flen; + fr_regex_flags_t regex_flags; + + memset(®ex_flags, 0, sizeof(regex_flags)); + + if (!tmpl_is_regex(c->data.map->rhs)) { + *error = "Expected regex"; + return -(rhs - start); + } + + flen = regex_flags_parse(&err, ®ex_flags, rhs + rhs_len + 1, strlen(rhs + rhs_len + 1), true); + switch (err) { + /* + * Got flags all the way to the end of the string + */ + case 0: + rad_assert(flen >= 0); + slen += (size_t)flen; + break; + + /* + * Found non-flag, this is OK. + */ + case -1: + rad_assert(flen <= 0); + fr_strerror(); /* Clear out the error buffer */ + slen += (size_t)(-flen); + break; + + case -2: + rad_assert(flen <= 0); + p = rhs + rhs_len + 1; + p += (size_t)(-flen); + return_P("Duplicate flag"); + } + c->data.map->rhs->tmpl_regex_flags = regex_flags; } #endif