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
|
From 2bda2989eee893c42ff04f48a904f00a33a7d07a Mon Sep 17 00:00:00 2001
From: Vsevolod Stakhov <vsevolod@highsecure.ru>
Date: Tue, 27 Feb 2018 16:37:44 +0000
Subject: [PATCH] [CritFix] Do not send reject messages after set reply
Libmilter seems to be totally brain damaged:
https://github.com/freebsd/freebsd/blob/386ddae58459341ec567604707805814a2128a57/contrib/sendmail/libmilter/engine.c#L66
---
src/libserver/milter.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
Back-ported for rspamd 1.5.6
diff -ur rspamd-1.6.6/src/libserver/milter.c rspamd-1.6.6-badmilter/src/libserver/milter.c
--- rspamd-1.6.6/src/libserver/milter.c 2018-02-16 13:47:47.000000000 +0000
+++ rspamd-1.6.6-badmilter/src/libserver/milter.c 2018-03-07 16:07:58.591483869 +0000
@@ -99,6 +99,8 @@
guint i;
if (how & RSPAMD_MILTER_RESET_IO) {
+ msg_debug_milter ("cleanup IO on abort");
+
DL_FOREACH_SAFE (priv->out_chain, obuf, obuf_tmp) {
rspamd_milter_obuf_free (obuf);
}
@@ -111,8 +113,11 @@
}
if (how & RSPAMD_MILTER_RESET_COMMON) {
+ msg_debug_milter ("cleanup common data on abort");
+
if (session->message) {
session->message->len = 0;
+ msg_debug_milter ("cleanup message on abort");
}
if (session->rcpts) {
@@ -120,30 +125,38 @@
rspamd_email_address_unref (cur);
}
+ msg_debug_milter ("cleanup %d recipients on abort",
+ (gint)session->rcpts->len);
+
g_ptr_array_free (session->rcpts, TRUE);
session->rcpts = NULL;
}
if (session->from) {
+ msg_debug_milter ("cleanup from");
rspamd_email_address_unref (session->from);
session->from = NULL;
}
if (session->helo) {
+ msg_debug_milter ("cleanup helo");
session->helo->len = 0;
}
if (session->hostname) {
+ msg_debug_milter ("cleanup hostname");
session->hostname->len = 0;
}
if (priv->headers) {
+ msg_debug_milter ("cleanup headers");
g_hash_table_remove_all (priv->headers);
}
}
if (how & RSPAMD_MILTER_RESET_ADDR) {
if (session->addr) {
+ msg_debug_milter ("cleanup addr");
rspamd_inet_address_free (session->addr);
session->addr = NULL;
}
@@ -151,6 +164,7 @@
if (how & RSPAMD_MILTER_RESET_MACRO) {
if (session->macros) {
+ msg_debug_milter ("cleanup macros");
g_hash_table_unref (session->macros);
session->macros = NULL;
}
@@ -1612,7 +1626,7 @@
msg_err_milter ("cannot find scan results, tempfail");
rspamd_milter_send_action (session, RSPAMD_MILTER_TEMPFAIL);
- return;
+ goto cleanup;
}
elt = ucl_object_lookup (results, "action");
@@ -1621,7 +1635,7 @@
msg_err_milter ("cannot find action in results, tempfail");
rspamd_milter_send_action (session, RSPAMD_MILTER_TEMPFAIL);
- return;
+ goto cleanup;
}
rspamd_action_from_str (ucl_object_tostring (elt), &action);
@@ -1681,7 +1695,6 @@
}
rspamd_milter_set_reply (session, rcode, xcode, reply);
- rspamd_milter_send_action (session, RSPAMD_MILTER_REJECT);
}
break;
case METRIC_ACTION_SOFT_REJECT:
@@ -1696,7 +1709,6 @@
}
rspamd_milter_set_reply (session, rcode, xcode, reply);
- rspamd_milter_send_action (session, RSPAMD_MILTER_REJECT);
break;
case METRIC_ACTION_REWRITE_SUBJECT:
@@ -1741,6 +1753,8 @@
rspamd_fstring_free (rcode);
rspamd_fstring_free (xcode);
rspamd_fstring_free (reply);
+
+ rspamd_milter_session_reset (session, RSPAMD_MILTER_RESET_ABORT);
}
void
|