summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilip Hazel <ph10@hermes.cam.ac.uk>2004-10-19 11:40:52 +0000
committerPhilip Hazel <ph10@hermes.cam.ac.uk>2004-10-19 11:40:52 +0000
commiteb2c02484772e04f92ec95769011ce2e6ad55bc2 (patch)
tree66f085761a9254036bd2c6afef5d34f4531cfc20 /src
parent5be20824c59ec2a16692d5ccfaf8c9bfcecbc6a3 (diff)
Add missing search cache tidyup before delivering message received via
the command line (could cause crashes if certain lookups were done during message reception).
Diffstat (limited to 'src')
-rw-r--r--src/ACKNOWLEDGMENTS5
-rw-r--r--src/src/exim.c35
2 files changed, 23 insertions, 17 deletions
diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS
index f58b5ce0b..53b9a8025 100644
--- a/src/ACKNOWLEDGMENTS
+++ b/src/ACKNOWLEDGMENTS
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.1 2004/10/06 11:36:51 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.2 2004/10/19 11:40:52 ph10 Exp $
EXIM ACKNOWLEDGEMENTS
@@ -20,7 +20,7 @@ relatively small patches.
Philip Hazel
Lists created: 20 November 2002
-Last updated: 04 October 2004
+Last updated: 19 October 2004
THE OLD LIST
@@ -189,6 +189,7 @@ William Thompson Suggested patch for acl_smtp_helo
Suggested patch for continuation lines in file ACLs
Patch for != support in DNS lists
Adam Thornton Patch for SMTP port expansion
+Rein Tollevik Patch to fix search cache missing tidyup
Stefan Traby Threaded Perl support
Samuli Tuomola OS files for QNX 6.2.0
Dave Turner Suggested patch for sender rewriting brokenness
diff --git a/src/src/exim.c b/src/src/exim.c
index c8d1917a4..8f51e66fa 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.5 2004/10/19 11:04:26 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.6 2004/10/19 11:40:52 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -196,9 +196,9 @@ os_non_restarting_signal(SIGALRM, sigalrm_handler);
/* This function is called by millisleep() and exim_wait_tick() to wait for a
period of time that may include a fraction of a second. The coding is somewhat
-tedious. We do not expect setitimer() ever to fail, but if it does, the process
-will wait for ever, so we panic in this instance. (There was a case of this
-when a bug in a function that calls milliwait() caused it to pass invalid data.
+tedious. We do not expect setitimer() ever to fail, but if it does, the process
+will wait for ever, so we panic in this instance. (There was a case of this
+when a bug in a function that calls milliwait() caused it to pass invalid data.
That's when I added the check. :-)
Argument: an itimerval structure containing the interval
@@ -214,8 +214,8 @@ sigset_t old_sigmask;
(void)sigaddset(&sigmask, SIGALRM); /* Add SIGALRM */
(void)sigprocmask(SIG_BLOCK, &sigmask, &old_sigmask); /* Block SIGALRM */
if (setitimer(ITIMER_REAL, itval, NULL) < 0) /* Start timer */
- log_write(0, LOG_MAIN|LOG_PANIC_DIE,
- "setitimer() failed: %s", strerror(errno));
+ log_write(0, LOG_MAIN|LOG_PANIC_DIE,
+ "setitimer() failed: %s", strerror(errno));
(void)sigfillset(&sigmask); /* All signals */
(void)sigdelset(&sigmask, SIGALRM); /* Remove SIGALRM */
(void)sigsuspend(&sigmask); /* Until SIGALRM */
@@ -2837,21 +2837,21 @@ else
strerror(errno));
rlp.rlim_cur = rlp.rlim_max = 0;
}
-
- /* I originally chose 1000 as a nice big number that was unlikely to
+
+ /* I originally chose 1000 as a nice big number that was unlikely to
be exceeded. It turns out that some older OS have a fixed upper limit of
256. */
-
+
if (rlp.rlim_cur < 1000)
{
rlp.rlim_cur = rlp.rlim_max = 1000;
if (setrlimit(RLIMIT_NOFILE, &rlp) < 0)
- {
+ {
rlp.rlim_cur = rlp.rlim_max = 256;
if (setrlimit(RLIMIT_NOFILE, &rlp) < 0)
log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NOFILE) failed: %s",
strerror(errno));
- }
+ }
}
#endif
@@ -4393,11 +4393,11 @@ while (more)
int rcount = 0;
int count = argc - recipients_arg;
uschar **list = argv + recipients_arg;
-
+
/* These options cannot be changed dynamically for non-SMTP messages */
-
+
active_local_sender_retain = local_sender_retain;
- active_local_from_check = local_from_check;
+ active_local_from_check = local_from_check;
/* Save before any rewriting */
@@ -4602,11 +4602,16 @@ while (more)
/* Else do the delivery unless the ACL or local_scan() called for queue only
or froze the message. Always deliver in a separate process. A fork failure is
not a disaster, as the delivery will eventually happen on a subsequent queue
- run. */
+ run. The search cache must be tidied before the fork, as the parent will
+ do it before exiting. The child will trigger a lookup failure and
+ thereby defer the delivery if it tries to use (for example) a cached ldap
+ connection that the parent has called unbind on. */
else if (!queue_only_policy && !deliver_freeze)
{
pid_t pid;
+ search_tidyup();
+
if ((pid = fork()) == 0)
{
int rc;