summaryrefslogtreecommitdiff
path: root/net-mail/vpopmail/files/vpopmail-5.4.33-fix-S-tag-in-case-spamassassin-changed-the-file-size.patch
blob: db22a6efde42d2448f13ce548b69102cfa7ea959 (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
From fd0a1034e3842ceb573851e62547b26a2b389263 Mon Sep 17 00:00:00 2001
From: Rolf Eike Beer <eike@sf-mail.de>
Date: Thu, 21 Aug 2014 18:48:52 +0200
Subject: [PATCH 5/5] fix ,S= tag in case spamassassin changed the file size

---
 vdelivermail.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/vpopmail-5.4.33/vdelivermail.c b/vpopmail-5.4.33/vdelivermail.c
index 2ad2e12..3631c3c 100644
--- a/vdelivermail.c
+++ b/vdelivermail.c
@@ -351,6 +351,12 @@ static pid_t qmail_inject_open(char *address)
     return(pid);
 }
 
+/**
+ * @returns if delivery worked
+ * @retval 0 message was delivered as is
+ * @retval 1 the file has changed the size during delivery
+ * @retval -1 error
+ */
 static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t headerlen, char *address)
 {
   char msgbuf[4096];
@@ -360,6 +366,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t
   long unsigned pid;
   int  pim[2];
 #endif
+  int has_changed_size = 0;
 
     /* write the Return-Path: and Delivered-To: headers */
     if (headerlen > 0) {
@@ -399,6 +406,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t
           close(pim[1]);
           dup2(pim[0], 0);
           close(pim[0]);
+          has_changed_size = 1;
         }
     }
 #endif
@@ -431,7 +439,7 @@ static int fdcopy (int write_fd, int read_fd, const char *extra_headers, size_t
         if ( write(write_fd, msgbuf, file_count) == -1 ) return -1;
     }
     
-    return 0;
+    return has_changed_size;
 }
 
 void read_quota_from_maildir (const char *maildir, char *qbuf, size_t qlen)
@@ -493,6 +501,7 @@ int deliver_to_maildir (
   size_t headerlen;
   int write_fd;
   char quota[80];
+  int fdr;
 
     headerlen = strlen (extra_headers);
     msgsize += headerlen;
@@ -518,7 +527,8 @@ int deliver_to_maildir (
     }
 
     local = 1;
-    if (fdcopy(write_fd, read_fd, extra_headers, headerlen, maildir_to_email(maildir)) != 0) {
+    fdr = fdcopy(write_fd, read_fd, extra_headers, headerlen, maildir_to_email(maildir));
+    if (fdr < 0) {
         /* Did the write fail because we were over quota? */
         if ( errno == EDQUOT ) {
             close(write_fd);
@@ -530,6 +540,14 @@ int deliver_to_maildir (
             unlink (local_file_tmp);
             return -2;
         }
+    } else if (fdr == 1) {
+       /* the file has changed it's size during delivery, e.g. because
+        * SpamAssassin has written it's report to it. */
+        struct stat st;
+
+        if (fstat(write_fd, &st) == 0 && st.st_size != msgsize)
+            snprintf(local_file_new, sizeof(local_file_new), "%snew/%lu.%lu.%.32s,S=%lu",
+                maildir, tm, pid, hostname, (long unsigned) st.st_size);
     }
 
     /* completed write to tmp directory, now move it into the new directory */
@@ -777,7 +795,7 @@ void deliver_mail(char *address, char *quota)
       }
       
       local = 0;
-      if (fdcopy (fdm, 0, DeliveredTo, strlen(DeliveredTo), address) != 0) {
+      if (fdcopy (fdm, 0, DeliveredTo, strlen(DeliveredTo), address) < 0) {
           printf ("write to qmail-inject failed: %d\n", errno);
           close(fdm);
           waitpid(inject_pid,&child,0);
-- 
1.8.4.5