summarylogtreecommitdiffstats
path: root/fixes-1.5.7.diff
blob: 66bad97d4f9a0488be317a56ffc2de8cd7eee06a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
diff --git a/conf/modules.d/dkim_signing.conf b/conf/modules.d/dkim_signing.conf
index c38b3e16..d032c944 100644
--- a/conf/modules.d/dkim_signing.conf
+++ b/conf/modules.d/dkim_signing.conf
@@ -53,7 +53,7 @@ dkim_signing {
   # Whether to get keys from Redis
   use_redis = false;
   # Hash for DKIM keys in Redis
-  hash_key = "DKIM_KEYS";
+  key_prefix = "DKIM_KEYS";
 
   # Domain specific settings
   #domain {
diff --git a/src/libutil/map.c b/src/libutil/map.c
index 57c84e37..e67e0f6f 100644
--- a/src/libutil/map.c
+++ b/src/libutil/map.c
@@ -717,6 +717,7 @@ rspamd_map_periodic_dtor (struct map_periodic_cbdata *periodic)
 
 	map = periodic->map;
 	msg_debug_map ("periodic dtor %p", periodic);
+	event_del (&periodic->ev);
 
 	if (periodic->need_modify) {
 		/* We are done */
@@ -770,20 +771,20 @@ rspamd_map_schedule_periodic (struct rspamd_map *map,
 	REF_INIT_RETAIN (cbd, rspamd_map_periodic_dtor);
 
 	if (initial) {
-		evtimer_set (&map->ev, rspamd_map_periodic_callback, cbd);
-		event_base_set (map->ev_base, &map->ev);
+		evtimer_set (&cbd->ev, rspamd_map_periodic_callback, cbd);
+		event_base_set (map->ev_base, &cbd->ev);
 	}
 	else {
-		evtimer_del (&map->ev);
-		evtimer_set (&map->ev, rspamd_map_periodic_callback, cbd);
-		event_base_set (map->ev_base, &map->ev);
+		evtimer_set (&cbd->ev, rspamd_map_periodic_callback, cbd);
+		event_base_set (map->ev_base, &cbd->ev);
 	}
 
 	jittered_sec = rspamd_time_jitter (timeout, 0);
-	msg_debug_map ("schedule new periodic event %p in %.2f seconds", cbd, jittered_sec);
+	msg_debug_map ("schedule new periodic event %p in %.2f seconds",
+			cbd, jittered_sec);
 	double_to_tv (jittered_sec, &map->tv);
 
-	evtimer_add (&map->ev, &map->tv);
+	evtimer_add (&cbd->ev, &map->tv);
 }
 
 static void
@@ -2290,7 +2291,7 @@ rspamd_re_map_insert_helper (gpointer st, gconstpointer key, gconstpointer value
 	}
 #else
 	if (pcre_flags & PCRE_FLAG(UTF)) {
-		re_map->map_flags |= RSPAMD_REGEXP_FLAG_UTF;
+		re_map->has_utf = TRUE;
 	}
 #endif
 
diff --git a/src/libutil/map_private.h b/src/libutil/map_private.h
index 9e24695b..4f00c3db 100644
--- a/src/libutil/map_private.h
+++ b/src/libutil/map_private.h
@@ -79,7 +79,6 @@ struct rspamd_map {
 	gchar *description;
 	gchar *name;
 	guint32 id;
-	struct event ev;
 	struct timeval tv;
 	gdouble poll_timeout;
 	/* Shared lock for temporary disabling of map reading (e.g. when this map is written by UI) */
@@ -123,6 +122,7 @@ enum rspamd_map_http_stage {
 struct map_periodic_cbdata {
 	struct rspamd_map *map;
 	struct map_cb_data cbdata;
+	struct event ev;
 	gboolean need_modify;
 	gboolean errored;
 	guint cur_backend;
diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c
index 2240ac53..dbf88e54 100644
--- a/src/plugins/fuzzy_check.c
+++ b/src/plugins/fuzzy_check.c
@@ -2396,7 +2396,8 @@ fuzzy_generate_commands (struct rspamd_task *task, struct fuzzy_rule *rule,
 #endif
 end:
 	if (res->len == 0) {
-		g_ptr_array_free (res, FALSE);
+		g_ptr_array_free (res, TRUE);
+
 		return NULL;
 	}
 
diff --git a/src/plugins/lua/antivirus.lua b/src/plugins/lua/antivirus.lua
index e83308b4..746d5e1c 100644
--- a/src/plugins/lua/antivirus.lua
+++ b/src/plugins/lua/antivirus.lua
@@ -33,10 +33,6 @@ local function match_patterns(default_sym, found, patterns)
   return default_sym
 end
 
-local function trim(s)
-  return s:match "^%s*(.-)%s*$"
-end
-
 local function yield_result(task, rule, vname)
   local all_whitelisted = true
   if type(vname) == 'string' then
@@ -585,15 +581,14 @@ local function savapi_check(task, rule)
 
       -- Non-terminal response
       elseif string.find(result, '310') then
-        -- Recursive result
-        local virus_obj = rspamd_str_split(result, ' object ')
         local virus
-        if virus_obj and virus_obj[2] then
-          virus = rspamd_str_split(virus_obj[2], '<<<')
-          virus = trim(virus[#virus])
-          virus = rspamd_str_split(virus, ' ; ')[1]
-        else
-          virus = trim(rspamd_str_split(result, ' ; ')[1])
+        virus = result:match "310.*<<<%s(.*)%s+;.*;.*"
+        if not virus then
+          virus = result:match "310%s(.*)%s+;.*;.*"
+          if not virus then
+            rspamd_logger.errx(task, "%s: virus result unparseable: %s", rule['type'], result)
+            return
+          end
         end
         -- Store unique virus names
         vnames[virus] = 1
diff --git a/src/plugins/lua/dkim_signing.lua b/src/plugins/lua/dkim_signing.lua
index 4843146a..4ae0f267 100644
--- a/src/plugins/lua/dkim_signing.lua
+++ b/src/plugins/lua/dkim_signing.lua
@@ -79,7 +79,7 @@ local function dkim_signing_cb(task)
     return false
   end
   local hfrom = task:get_from('mime')
-  if not settings.allow_hdrfrom_multiple and hfrom[2] then
+  if not settings.allow_hdrfrom_multiple and (hfrom or E)[2] then
     rspamd_logger.debugm(N, task, 'multiple header from not allowed')
     return false
   end
@@ -203,7 +203,7 @@ local function dkim_signing_cb(task)
     local ret = rspamd_redis_make_request(task,
       redis_params, -- connect params
       rk, -- hash key
-      true, -- is write
+      false, -- is write
       redis_key_cb, --callback
       'HGET', -- command
       {settings.key_prefix, rk} -- arguments
diff --git a/src/plugins/lua/multimap.lua b/src/plugins/lua/multimap.lua
index c8591988..f5f5edac 100644
--- a/src/plugins/lua/multimap.lua
+++ b/src/plugins/lua/multimap.lua
@@ -369,7 +369,8 @@ local function multimap_callback(task, rule)
       ret = r['cdb']:lookup(srch)
     elseif r['redis_key'] then
       local srch = value
-      if r['type'] == 'ip' then
+      if r['type'] == 'ip' or (r['type'] == 'received' and
+        (r['filter'] == 'real_ip' or r['filter'] == 'from_ip' or not r['filter'])) then
         srch = value:to_string()
       end
       ret = rspamd_redis_make_request(task,