summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-12-06 13:55:59 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-12-06 13:55:59 +0000
commite7cdc37c932d82db4fa026e1754ea2cd651a0620 (patch)
tree050c7fad5293822e5694d5278ef2667fa771b34a /src
parent958cbf047b81c507d3d73deddaf1ee48a36e6415 (diff)
downloadrspamd-e7cdc37c932d82db4fa026e1754ea2cd651a0620.tar.gz
rspamd-e7cdc37c932d82db4fa026e1754ea2cd651a0620.zip
Fix re cache replacement method
Diffstat (limited to 'src')
-rw-r--r--src/libserver/re_cache.c15
-rw-r--r--src/libserver/re_cache.h6
-rw-r--r--src/lua/lua_config.c44
3 files changed, 13 insertions, 52 deletions
diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c
index 7d3dea30a..1ba2a8234 100644
--- a/src/libserver/re_cache.c
+++ b/src/libserver/re_cache.c
@@ -138,6 +138,7 @@ rspamd_re_cache_add (struct rspamd_re_cache *cache, rspamd_regexp_t *re,
* We set re id based on the global position in the cache
*/
rspamd_regexp_set_cache_id (re, cache->nre ++);
+ rspamd_regexp_set_class (re, re_class);
nre = rspamd_regexp_ref (re);
g_hash_table_insert (re_class->re, nre, nre);
}
@@ -145,12 +146,9 @@ rspamd_re_cache_add (struct rspamd_re_cache *cache, rspamd_regexp_t *re,
void
rspamd_re_cache_replace (struct rspamd_re_cache *cache,
rspamd_regexp_t *what,
- enum rspamd_re_type type,
- gpointer type_data,
- gsize datalen,
rspamd_regexp_t *with)
{
- guint64 class_id, re_id;
+ guint64 re_id;
struct rspamd_re_class *re_class;
rspamd_regexp_t *src;
@@ -158,8 +156,7 @@ rspamd_re_cache_replace (struct rspamd_re_cache *cache,
g_assert (what != NULL);
g_assert (with != NULL);
- class_id = rspamd_re_cache_class_id (type, type_data, datalen);
- re_class = g_hash_table_lookup (cache->re_classes, &class_id);
+ re_class = rspamd_regexp_get_class (what);
if (re_class != NULL) {
re_id = rspamd_regexp_get_cache_id (what);
@@ -168,8 +165,12 @@ rspamd_re_cache_replace (struct rspamd_re_cache *cache,
src = g_hash_table_lookup (re_class->re, what);
if (src) {
+ rspamd_regexp_set_cache_id (what, RSPAMD_INVALID_ID);
+ rspamd_regexp_set_class (what, NULL);
+ rspamd_regexp_set_cache_id (with, re_id);
+ rspamd_regexp_set_class (with, re_class);
/*
- * On calling of this function, we actually unref old re
+ * On calling of this function, we actually unref old re (what)
*/
g_hash_table_insert (re_class->re, what, rspamd_regexp_ref (with));
}
diff --git a/src/libserver/re_cache.h b/src/libserver/re_cache.h
index 6f2c0f312..0ced10bd6 100644
--- a/src/libserver/re_cache.h
+++ b/src/libserver/re_cache.h
@@ -59,16 +59,10 @@ void rspamd_re_cache_add (struct rspamd_re_cache *cache, rspamd_regexp_t *re,
* Replace regexp in the cache with another regexp
* @param cache cache object
* @param what re to replace
- * @param type type of object
- * @param type_data associated data with the type (e.g. header name)
- * @param datalen associated data length
* @param with regexp object to replace the origin
*/
void rspamd_re_cache_replace (struct rspamd_re_cache *cache,
rspamd_regexp_t *what,
- enum rspamd_re_type type,
- gpointer type_data,
- gsize datalen,
rspamd_regexp_t *with);
/**
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 5743a5ad1..d495d0c9e 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -369,15 +369,8 @@ LUA_FUNCTION_DEF (config, register_regexp);
* @method rspamd_config:replace_regexp(params)
* Replaces regexp with a new one
* Params is the table with the follwoing fields (mandatory fields are marked with `*`):
- * - `old_re`* : old regular expression object
- * - `new_re`* : old regular expression object
- * - `type`*: type of regular expression:
- * + `mime`: mime regexp
- * + `header`: header regexp
- * + `rawheader`: raw header expression
- * + `body`: raw body regexp
- * + `url`: url regexp
- * - `header`: for header and rawheader regexp means the name of header
+ * - `old_re`* : old regular expression object (must be in the cache)
+ * - `new_re`* : old regular expression object (must not be in the cache)
*/
LUA_FUNCTION_DEF (config, replace_regexp);
@@ -1631,15 +1624,12 @@ lua_config_replace_regexp (lua_State *L)
{
struct rspamd_config *cfg = lua_check_config (L, 1);
struct rspamd_lua_regexp *old_re = NULL, *new_re = NULL;
- const gchar *type_str = NULL, *header_str = NULL;
- gsize header_len = 0;
GError *err = NULL;
- enum rspamd_re_type type = RSPAMD_RE_BODY;
if (cfg != NULL) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
- "*old_re=U{regexp};*new_re=U{regexp};*type=S;header=V",
- &old_re, &new_re, &type_str, &header_len, &header_str)) {
+ "*old_re=U{regexp};*new_re=U{regexp}",
+ &old_re, &new_re)) {
msg_err_config ("cannot get parameters list: %e", err);
if (err) {
@@ -1647,31 +1637,7 @@ lua_config_replace_regexp (lua_State *L)
}
}
else {
- if (strcmp (type_str, "header") == 0) {
- type = RSPAMD_RE_HEADER;
- }
- else if (strcmp (type_str, "rawheader") == 0) {
- type = RSPAMD_RE_RAWHEADER;
- }
- else if (strcmp (type_str, "mime") == 0) {
- type = RSPAMD_RE_MIME;
- }
- else if (strcmp (type_str, "body") == 0) {
- type = RSPAMD_RE_BODY;
- }
- else if (strcmp (type_str, "url") == 0) {
- type = RSPAMD_RE_URL;
- }
-
- if ((type == RSPAMD_RE_HEADER || type == RSPAMD_RE_RAWHEADER)
- && header_str == NULL) {
- msg_err_config (
- "header argument is mandatory for header/rawheader regexps");
- }
- else {
- rspamd_re_cache_replace (cfg->re_cache, old_re->re,
- type, (gpointer) header_str, header_len, new_re->re);
- }
+ rspamd_re_cache_replace (cfg->re_cache, old_re->re, new_re->re);
}
}