]> source.dussan.org Git - rspamd.git/commitdiff
* Threat raw header regexps as raw regexps
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 16 Apr 2009 13:13:37 +0000 (17:13 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 16 Apr 2009 13:13:37 +0000 (17:13 +0400)
* Add regexp flag /r for raw regexp of any types

README.utf8.txt
src/expressions.c
src/plugins/regexp.c

index d328efa7ef7ac1c986a45fc6e0c5f0601900cda7..b2461f20bf0210f7c045d18c51414994f8d67f7c 100644 (file)
@@ -101,6 +101,7 @@ headername=/pattern/flags
 если регэксп ищет соответствие хедера и выражения
 Флаги регэскпов:
 i, m, s, x, u, o - такие же, как у perl/pcre
+r - "сырой" незакодированный в utf8 regexp
 H - ищет по заголовкам
 M - ищет по всему сообщению (в "сыром" виде)
 P - ищет по всем mime частям
index 08570834280f654719f010902dfc6e789e5c9633..6519879c510ac97499ee381e72ac5337c0d36d15 100644 (file)
@@ -575,6 +575,10 @@ parse_regexp (memory_pool_t *pool, char *line)
                                regexp_flags |= G_REGEX_OPTIMIZE;
                                p ++;
                                break;
+                       case 'r':
+                               regexp_flags |= G_REGEX_RAW;
+                               p ++;
+                               break;
                        /* Type flags */
                        case 'H':
                                if (result->type == REGEXP_NONE) {
@@ -638,8 +642,13 @@ parse_regexp (memory_pool_t *pool, char *line)
                msg_warn ("parse_regexp: could not read regexp: %s while reading regexp %s", err->message, src);
                return NULL;
        }
-       result->raw_regexp = g_regex_new (begin, regexp_flags | G_REGEX_RAW, 0, &err);
-       memory_pool_add_destructor (pool, (pool_destruct_func)g_regex_unref, (void *)result->raw_regexp);
+       if ((regexp_flags & G_REGEX_RAW) != 0) {
+               result->raw_regexp = result->regexp;
+       }
+       else {
+               result->raw_regexp = g_regex_new (begin, regexp_flags | G_REGEX_RAW, 0, &err);
+               memory_pool_add_destructor (pool, (pool_destruct_func)g_regex_unref, (void *)result->raw_regexp);
+       }
        *end = '/';
 
        if (result->raw_regexp == NULL || err != NULL) {
index fa9eafdd498dda54b3a570ff84bb2603a0ede9d5..f057b29c2a150bced35f87981dfdfa4a01e27e5e 100644 (file)
@@ -279,7 +279,7 @@ process_regexp (struct rspamd_regexp *re, struct worker_task *task)
                        /* Temporary null terminate this part of string */
                        t = *c;
                        *c = '\0';
-                       if (g_regex_match (re->regexp, headerv, 0, NULL) == TRUE) {
+                       if (g_regex_match (re->raw_regexp, headerv, 0, NULL) == TRUE) {
                                *c = t;
                                task_cache_add (task, re, 1);
                                return 1;