diff --git a/include/common/regex.h b/include/common/regex.h index 9080bda44..59730cac9 100644 --- a/include/common/regex.h +++ b/include/common/regex.h @@ -83,11 +83,20 @@ const char *check_replace_string(const char *str); const char *chain_regex(struct hdr_exp **head, const regex_t *preg, int action, const char *replace, void *cond); -static inline int regex_exec(const regex *preg, const char *subject, int length) { +/* Note that MUST be at least characters long and must + * be writable because the function will temporarily force a zero past the + * last character. + */ +static inline int regex_exec(const regex *preg, char *subject, int length) { #ifdef USE_PCRE_JIT return pcre_exec(preg->reg, preg->extra, subject, length, 0, 0, NULL, 0); #else - return regexec(preg, subject, 0, NULL, 0); + int match; + char old_char = subject[length]; + subject[length] = 0; + match = regexec(preg, subject, 0, NULL, 0); + subject[length] = old_char; + return match; #endif } diff --git a/src/acl.c b/src/acl.c index 89bfdf5a0..e6cbd306a 100644 --- a/src/acl.c +++ b/src/acl.c @@ -163,19 +163,9 @@ static void *acl_lookup_str(struct sample *smp, struct acl_expr *expr) */ int acl_match_reg(struct sample *smp, struct acl_pattern *pattern) { - char old_char; - int ret; - - old_char = smp->data.str.str[smp->data.str.len]; - smp->data.str.str[smp->data.str.len] = 0; - if (regex_exec(pattern->ptr.reg, smp->data.str.str, smp->data.str.len) == 0) - ret = ACL_PAT_PASS; - else - ret = ACL_PAT_FAIL; - - smp->data.str.str[smp->data.str.len] = old_char; - return ret; + return ACL_PAT_PASS; + return ACL_PAT_FAIL; } /* Checks that the pattern matches the beginning of the tested string. */