From: Vsevolod Stakhov Date: Sun, 5 Apr 2009 16:42:45 +0000 (+0400) Subject: * When parse regexp save it to cache to make unique link between X-Git-Tag: 0.2.7~201 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=94cfcac7c50e1d2be5d93ed778ab91e6983a5fad;p=rspamd.git * When parse regexp save it to cache to make unique link between regexp text and regexp parsed structure --- 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; }