aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-04-05 20:42:45 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-04-05 20:42:45 +0400
commit94cfcac7c50e1d2be5d93ed778ab91e6983a5fad (patch)
tree58855eae78289ceb6d7cbd4f92903fb377af3073 /src
parent4a79d0e82a5e2040e8dd5d4b8fb12fbf4672d8ce (diff)
downloadrspamd-94cfcac7c50e1d2be5d93ed778ab91e6983a5fad.tar.gz
rspamd-94cfcac7c50e1d2be5d93ed778ab91e6983a5fad.zip
* When parse regexp save it to cache to make unique link between
regexp text and regexp parsed structure
Diffstat (limited to 'src')
-rw-r--r--src/expressions.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/expressions.c b/src/expressions.c
index e3747c013..4cacea029 100644
--- a/src/expressions.c
+++ b/src/expressions.c
@@ -485,7 +485,7 @@ struct rspamd_regexp*
parse_regexp (memory_pool_t *pool, char *line)
{
char *begin, *end, *p, *src;
- struct rspamd_regexp *result;
+ struct rspamd_regexp *result, *check;
int regexp_flags = 0;
GError *err = NULL;
@@ -614,6 +614,21 @@ parse_regexp (memory_pool_t *pool, char *line)
}
*end = '\0';
+
+ /* Avoid multiply regexp structures for similar regexps */
+ if ((check = (struct rspamd_regexp *)re_cache_check (begin)) != NULL) {
+ /* Additional check for headers */
+ if (result->type == REGEXP_HEADER || result->type == REGEXP_RAW_HEADER) {
+ if (result->header && check->header) {
+ if (strcmp (result->header, check->header) == 0) {
+ return check;
+ }
+ }
+ }
+ else {
+ return check;
+ }
+ }
result->regexp = g_regex_new (begin, regexp_flags, 0, &err);
result->regexp_text = memory_pool_strdup (pool, begin);
memory_pool_add_destructor (pool, (pool_destruct_func)g_regex_unref, (void *)result->regexp);
@@ -623,7 +638,9 @@ 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;
}
-
+
+ /* Add to cache for further usage */
+ re_cache_add (result->regexp_text, result);
return result;
}