Add missing search_tidyup() calls for the subprocess used for running
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 2 Aug 2005 13:43:04 +0000 (13:43 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 2 Aug 2005 13:43:04 +0000 (13:43 +0000)
filters.

doc/doc-txt/ChangeLog
src/src/rda.c

index 2325cdb..0283def 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.194 2005/08/02 11:23:27 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.195 2005/08/02 13:43:04 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -45,6 +45,11 @@ PH/11 Added support for the IGNOREQUOTA extension to LMTP, both to the lmtp
 
 TK/02 Remove one case of BASE64 error detection FTTB (undocumented anyway).
 
+PH/12 There was a missing call to search_tidyup() before the fork() in rda.c to
+      run a filter in a subprocess. This could lead to confusion in subsequent
+      lookups in the parent process. There should also be a search_tidyup() at
+      the end of the subprocess.
+
 
 Exim version 4.52
 -----------------
index 06eff22..7819a80 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/rda.c,v 1.8 2005/06/27 14:29:43 ph10 Exp $ */
+/* $Cambridge: exim/src/src/rda.c,v 1.9 2005/08/02 13:43:04 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -607,9 +607,13 @@ if (pipe(pfd) != 0)
 
 /* Ensure that SIGCHLD is set to SIG_DFL before forking, so that the child
 process can be waited for. We sometimes get here with it set otherwise. Save
-the old state for resetting on the wait. */
+the old state for resetting on the wait. Ensure that all cached resources are
+freed so that the subprocess starts with a clean slate and doesn't interfere
+with the parent process. */
 
 oldsignal = signal(SIGCHLD, SIG_DFL);
+search_tidyup();
+
 if ((pid = fork()) == 0)
   {
   header_line *waslast = header_last;   /* Save last header */
@@ -740,9 +744,11 @@ if ((pid = fork()) == 0)
     rda_write_string(fd, NULL);   /* Marks end of addresses */
     }
 
-  /* OK, this process is now done. Must use _exit() and not exit() !! */
+  /* OK, this process is now done. Free any cached resources. Must use _exit()
+  and not exit() !! */
 
   (void)close(fd);
+  search_tidyup();
   _exit(0);
   }