Add missing search cache tidyup before delivering message received via
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 19 Oct 2004 11:40:52 +0000 (11:40 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 19 Oct 2004 11:40:52 +0000 (11:40 +0000)
the command line (could cause crashes if certain lookups were done
during message reception).

doc/doc-txt/ChangeLog
src/ACKNOWLEDGMENTS
src/src/exim.c

index c2f9471..c959e63 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.11 2004/10/19 11:29:25 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.12 2004/10/19 11:40:52 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -42,6 +42,11 @@ Exim version 4.44
 
 10. $recipients is now available in the predata ACL (oversight).
 
+11. Tidy the search cache before the fork to do a delivery from a message
+    received from the command line. Otherwise 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.
+
 
 Exim version 4.43
 -----------------
index f58b5ce..53b9a80 100644 (file)
@@ -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
index c8d1917..8f51e66 100644 (file)
@@ -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;