summaryrefslogtreecommitdiff
path: root/mail/exim/files
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@FreeBSD.org>2015-08-25 22:31:15 +0000
committerVsevolod Stakhov <vsevolod@FreeBSD.org>2015-08-25 22:31:15 +0000
commit02e3320c237961d2284f58278e93ed81651075cc (patch)
treee734065b28cc5e70e1e8ebe08d9d2d20491d7835 /mail/exim/files
parentUpgrade to version 0.3.3. (diff)
Import the patch to fix segfault during delivery from exim git [1].
[1]: https://bugs.exim.org/show_bug.cgi?id=1671
Notes
Notes: svn path=/head/; revision=395319
Diffstat (limited to 'mail/exim/files')
-rw-r--r--mail/exim/files/patch-post-transport-crash82
1 files changed, 82 insertions, 0 deletions
diff --git a/mail/exim/files/patch-post-transport-crash b/mail/exim/files/patch-post-transport-crash
new file mode 100644
index 000000000000..6bb69b11925c
--- /dev/null
+++ b/mail/exim/files/patch-post-transport-crash
@@ -0,0 +1,82 @@
+diff --git src/deliver.c.orig src/src/deliver.c
+index 0e7cea3..b5aa9b9 100644
+--- src/deliver.c.orig
++++ src/deliver.c
+@@ -9,6 +9,7 @@
+
+
+ #include "exim.h"
++#include <assert.h>
+
+
+ /* Data block for keeping track of subprocesses for parallel remote
+@@ -7914,17 +7915,36 @@ if (!regex_IGNOREQUOTA) regex_IGNOREQUOTA =
+ uschar *
+ deliver_get_sender_address (uschar * id)
+ {
++int rc;
++uschar * new_sender_address,
++ * save_sender_address;
++
+ if (!spool_open_datafile(id))
+ return NULL;
+
++/* Save and restore the global sender_address. I'm not sure if we should
++not save/restore all the other global variables too, because
++spool_read_header() may change all of them. But OTOH, when this
++deliver_get_sender_address() gets called, the current message is done
++already and nobody needs the globals anymore. (HS12, 2015-08-21) */
++
+ sprintf(CS spoolname, "%s-H", id);
+-if (spool_read_header(spoolname, TRUE, TRUE) != spool_read_OK)
++save_sender_address = sender_address;
++
++rc = spool_read_header(spoolname, TRUE, TRUE);
++
++new_sender_address = sender_address;
++sender_address = save_sender_address;
++
++if (rc != spool_read_OK)
+ return NULL;
+
++assert(new_sender_address);
++
+ (void)close(deliver_datafile);
+ deliver_datafile = -1;
+
+-return sender_address;
++return new_sender_address;
+ }
+
+ /* vi: aw ai sw=2
+diff --git src/transports/smtp.c.orig src/transports/smtp.c
+index 609dba3..c93f2ef 100644
+--- src/transports/smtp.c.orig
++++ src/transports/smtp.c
+@@ -1274,14 +1274,19 @@ we will veto this new message. */
+ static BOOL
+ smtp_are_same_identities(uschar * message_id, smtp_compare_t * s_compare)
+ {
+-uschar * save_sender_address = sender_address;
+-uschar * current_local_identity =
++
++uschar * message_local_identity,
++ * current_local_identity,
++ * new_sender_address;
++
++current_local_identity =
+ smtp_local_identity(s_compare->current_sender_address, s_compare->tblock);
+-uschar * new_sender_address = deliver_get_sender_address(message_id);
+-uschar * message_local_identity =
+- smtp_local_identity(new_sender_address, s_compare->tblock);
+
+-sender_address = save_sender_address;
++if (!(new_sender_address = deliver_get_sender_address(message_id)))
++ return 0;
++
++message_local_identity =
++ smtp_local_identity(new_sender_address, s_compare->tblock);
+
+ return Ustrcmp(current_local_identity, message_local_identity) == 0;
+ }
+