diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-04-05 20:42:45 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-04-05 20:42:45 +0400 |
commit | 94cfcac7c50e1d2be5d93ed778ab91e6983a5fad (patch) | |
tree | 58855eae78289ceb6d7cbd4f92903fb377af3073 /src | |
parent | 4a79d0e82a5e2040e8dd5d4b8fb12fbf4672d8ce (diff) | |
download | rspamd-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.c | 21 |
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; } |