aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2022-07-30 20:43:23 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2022-07-30 20:43:23 +0100
commit228c83425d80b79657b7c151c8656d048857330c (patch)
tree4515b1bd2cfc66e4219a8e243c21f1d19408ac97 /src/libutil
parentb786357c32755c3ef59888b529990a2753d5a556 (diff)
downloadrspamd-228c83425d80b79657b7c151c8656d048857330c.tar.gz
rspamd-228c83425d80b79657b7c151c8656d048857330c.zip
[Minor] Glob patterns actually allow ranges
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/str_util.c37
1 files 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: