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 <subject> MUST be at least <length+1> 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
}
*/
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. */