From: Vsevolod Stakhov Date: Thu, 16 Apr 2009 13:13:37 +0000 (+0400) Subject: * Threat raw header regexps as raw regexps X-Git-Tag: 0.2.7~194 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=83f0dbe021888839dbcc3b3d6dff48b8da21cffb;p=rspamd.git * Threat raw header regexps as raw regexps * Add regexp flag /r for raw regexp of any types --- diff --git a/README.utf8.txt b/README.utf8.txt index d328efa7e..b2461f20b 100644 --- a/README.utf8.txt +++ b/README.utf8.txt @@ -101,6 +101,7 @@ headername=/pattern/flags если регэксп ищет соответствие хедера и выражения Флаги регэскпов: i, m, s, x, u, o - такие же, как у perl/pcre +r - "сырой" незакодированный в utf8 regexp H - ищет по заголовкам M - ищет по всему сообщению (в "сыром" виде) P - ищет по всем mime частям diff --git a/src/expressions.c b/src/expressions.c index 085708342..6519879c5 100644 --- a/src/expressions.c +++ b/src/expressions.c @@ -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) { diff --git a/src/plugins/regexp.c b/src/plugins/regexp.c index fa9eafdd4..f057b29c2 100644 --- a/src/plugins/regexp.c +++ b/src/plugins/regexp.c @@ -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;