summaryrefslogtreecommitdiff
path: root/mail-filter/rspamd/files/1.6.6-dont-send-reject-message-after-set-reply.patch
blob: 4238c838dfa9117e092b8523c5bf8af572cb99b0 (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
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