From 228c83425d80b79657b7c151c8656d048857330c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 30 Jul 2022 20:43:23 +0100 Subject: [PATCH] [Minor] Glob patterns actually allow ranges --- src/libutil/str_util.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c index 849d11a4f..86369909a 100644 --- a/src/libutil/str_util.c +++ b/src/libutil/str_util.c @@ -3203,7 +3203,6 @@ rspamd_str_regexp_escape (const gchar *pattern, gsize slen, switch (t) { case '[': case ']': - case '-': case '\\': case '{': case '}': @@ -3219,6 +3218,36 @@ rspamd_str_regexp_escape (const gchar *pattern, gsize slen, *d++ = '\\'; } break; + case '-': + if (flags & RSPAMD_REGEXP_ESCAPE_GLOB) { + /* + * For glob patterns, we need to ensure that a previous character is alphanumeric + * and there is `[` symbol somewhere before + */ + bool seen_brace = false; + const char *search = p; + + while (search > pattern) { + if (!g_ascii_isalnum(*search) && *search != '-') { + break; + } + if (*search == '[' ) { + seen_brace = true; + break; + } + + search --; + } + + if (!seen_brace) { + /* Escape `-` symbol */ + *d++ = '\\'; + } + } + else if (!(flags & RSPAMD_REGEXP_ESCAPE_RE)) { + *d++ = '\\'; + } + break; case '*': case '?': case '+': @@ -3226,10 +3255,8 @@ rspamd_str_regexp_escape (const gchar *pattern, gsize slen, /* Treat * as .* and ? as .? */ *d++ = '.'; } - else { - if (!(flags & RSPAMD_REGEXP_ESCAPE_RE)) { - *d++ = '\\'; - } + else if (!(flags & RSPAMD_REGEXP_ESCAPE_RE)) { + *d++ = '\\'; } break; default: -- 2.39.5